我需要能够检查构成形状的一部分的三点(A、B 和 C)之间的角度是否是反射的(> PI 弧度),如下图所示(抱歉绘画技巧不佳!):
我的点应该总是逆时针的,我总是想测量形状内部的角度。
我目前正在使用以下代码执行此操作:
//triangle[] is an array of the three points I am testing, corresponding
// to [A, B, C] on the diagram above
//Vectors from B to A and C
PointF toA = PointFVectorTools.difference(triangle[0], triangle[1]);
PointF toC = PointFVectorTools.difference(triangle[2], triangle[1]);
double angle = Math.Atan2(toB.Y, toB.X) - Math.Atan2(toA.Y, toA.X);
//Put angle in range 0 to 2 PI
if (angle < 0) angle += 2 * Math.PI;
return angle > Math.PI;
到目前为止,这在我尝试过的所有情况下都有效,但是对于这些坐标它不起作用:
(其中 B=(2,3) )
我回来的角度是〜-0.5,而我希望〜+ 0.5。任何想法为什么这是错误的?
更新
我试图实现 Nico 的解决方案,虽然我在理论上理解它,但我在尝试实现它时感到非常头疼。这是到目前为止的代码:
//Vector A -> B
float dx = triangle[1].X - triangle[0].X;
float dy = triangle[1].Y - triangle[0].Y;
//Left normal = (y, -x)
PointF leftDir = new PointF(dy, -dx);
//Vector B -> C
dx = triangle[2].X - triangle[1].X;
dy = triangle[2].Y - triangle[1].Y;
//Dot product of B->C and Left normal
float dot = dx * leftDir.X + dy * leftDir.Y;
return dot < 0;