설명이있는 매우 간단한 기하학적 솔루션
며칠 전, 같은 문제에 빠졌고 수학 책과 함께 앉아야했습니다. 몇 가지 기본 공식을 결합하고 단순화하여 문제를 해결했습니다.
이 그림을 고려해 봅시다.
ϴ 를 알고 싶기 때문에 먼저 α 와 β 를 알아 내야 합니다. 이제 모든 직선에 대해
y = m * x + c
Let- A = (ax, ay) , B = (bx, by) , O = (ox, oy) . 따라서 OA 라인의 경우 -
oy = m1 * ox + c ⇒ c = oy - m1 * ox ...(eqn-1)
ay = m1 * ax + c ⇒ ay = m1 * ax + oy - m1 * ox [from eqn-1]
⇒ ay = m1 * ax + oy - m1 * ox
⇒ m1 = (ay - oy) / (ax - ox)
⇒ tan α = (ay - oy) / (ax - ox) [m = slope = tan ϴ] ...(eqn-2)
같은 방식으로 라인 OB의 경우 -
tan β = (by - oy) / (bx - ox) ...(eqn-3)
이제 ϴ = β - α
. 삼각법에서는 공식이 있습니다.
tan (β-α) = (tan β + tan α) / (1 - tan β * tan α) ...(eqn-4)
tan α
eqn-4에서 (from eqn-2) 및 tan b
(from eqn-3) 의 값을 바꾸고 단순화를 적용하면
tan (β-α) = ( (ax-ox)*(by-oy)+(ay-oy)*(bx-ox) ) / ( (ax-ox)*(bx-ox)-(ay-oy)*(by-oy) )
그래서,
ϴ = β-α = tan^(-1) ( ((ax-ox)*(by-oy)+(ay-oy)*(bx-ox)) / ((ax-ox)*(bx-ox)-(ay-oy)*(by-oy)) )
그게 다야!
이제 다음 그림을보십시오.
이 C # 또는 Java 방법은 각도 ( ϴ )를 계산합니다.
private double calculateAngle(double P1X, double P1Y, double P2X, double P2Y,
double P3X, double P3Y){
double numerator = P2Y*(P1X-P3X) + P1Y*(P3X-P2X) + P3Y*(P2X-P1X);
double denominator = (P2X-P1X)*(P1X-P3X) + (P2Y-P1Y)*(P1Y-P3Y);
double ratio = numerator/denominator;
double angleRad = Math.Atan(ratio);
double angleDeg = (angleRad*180)/Math.PI;
if(angleDeg<0){
angleDeg = 180+angleDeg;
}
return angleDeg;
}