寻找多边形的内角

Kam*_*ity 4 geometry computational-geometry

我有一些线,他们的交集描述了一个多边形,如下所示:

主多边形

我知道线的顺序和它们的方程式.

为了找到内部角度,我找到了每个线的方向.但是我很困惑,因为减去两条线的方向会产生两个不同的角度,即使我按照多边形的边排序.

例如,在下图中,如果我只是减去线条的方向,我会得到以下任何一个角度:

缺陷1

让我更困惑的是,当多边形不是凸面时,我的角度大于180,并且使用我的方法我根本得不到正确的角度:

缺陷2

我发现这种解决问题的方法是错误的.

那么,使用线条找到内部角度的最佳方法是什么?我知道对于凸多边形,我可能会找到向量,然后找到它们之间的角度,但即使对于我的例子中的P6,向量方法也会失败.

无论如何,我更喜欢一种方法,它不包括解决这个凹度问题的条件案例.

谢谢.

MBo*_*MBo 6

对于有序线,可以按顺时针顺序找到交点(多边形顶点).然后你可以计算内角:

Angle[i] =  Pi + ArcTan2(V[i] x V[i+1], V[i] * V[i+1]) 
Run Code Online (Sandbox Code Playgroud)

(每个顶点的传入和传出向量的交叉积和点积)

要么

Angle[i] = Pi + ArcTan2( dx_in*dy_out-dx_out*dy_in, dx_in*dx_out+dy_in*dy_out2 )
Run Code Online (Sandbox Code Playgroud)

注意:Pi对于逆时针方向,请在减号后更改加号.

编辑:

请注意,crossproduct和dotproduct是标量,而不是向量.

您的数据示例:

dx1 = 5; dy1 = -15; dx2 = -15; dy2 = 5

Angle = Pi + ArcTan2(5*5-15*15, -5*15-5*15) = Pi - 2.11 radians ~ 59 degrees
Run Code Online (Sandbox Code Playgroud)

载体的例子:

(0,-1) (1,0) (L-curve)

Angle = Pi + ArcTan2(1, 0) =  270 degrees
Run Code Online (Sandbox Code Playgroud)

  • 阅读[关于叉积的 wiki](http://en.wikipedia.org/wiki/Cross_product)。叉积返回一个 **向量**,垂直于多边形所在的平面。因为 |<sub>1</sub>×<sub>2</sub>| = |<sub>1</sub>||<sub>2</sub>|sin() 和 <sub>1</sub>·<sub>2</sub> = |<sub>1</ sub>||<sub>2</sub>|cos(),并且由于 tan() == sin()/cos(),取 |cross|/dot 的反正切即可找到角度(但请注意 *大小*标志)。你的方法是正确的,但你的理解不完整。 (2认同)