Угол между 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;
}