Угол между 3 точками в С

Как определить (в C) угол между точкой A(x1,y1), B(x2,y2) и C(x3,y3)? Например, угол с центром в B, может быть, с atan2.

2 ответа

Переведите B в начало координат, чтобы A было (x1-x2,y1-y2), а C - (x3-x2,y3-y2), теперь найдите углы BA,BC с осью x и возьмите разницу (угол равен arctan(y/x)) или atan2 на многих языках)

Как упомянул @Vicky Manoharan, переведите источник вашей системы в точку B.

Следующее использование atan2() чтобы найти каждый угол (в радианах) относительно оси +x, затем вычтите.

Важно использовать atan2() и не atan() рассчитать правильный +/-π радиан ответ.

Простое вычитание дает ответы в диапазоне от -2*π до 2*π. Предложите уменьшение диапазона до -π до +π.

Должен ли код использовать float, менять atan2() в atan2f(),

typedef struct {
  double x, y;
} point_T;

#ifndef M_PI
#define M_PI 3.1415926535897932384626433832795
#endif

double AngleBetween3Points(point_T A, point_T B, point_T C) {
  double atanA = atan2(A.x - B.x, A.y - B.y);
  double atanC = atan2(C.x - B.x, C.y - B.y);
  double diff = atanC - atanA;

  if (diff > M_PI) diff -= M_PI;
  else if (diff < -M_PI) diff += M_PI;

  // Convert to degrees if desired.
  diff *= 180 / M_PI;

  return diff;
} 
Другие вопросы по тегам