给定一组折线,我发现检测角度类型(无论是内部还是外部轴的原点)存在问题。我发现了几十个非常相似的问题,但没有一个能解决我的问题,所以我把它放在这里,希望能有结果。
我所拥有的只是一组折线。我需要找到角度(具有接近矩形的给定公差),并将它们分类为内部或外部。
对于每条折线,我将顶点 3 乘以 3,并且我能够识别中心是否是角度,并将其值测量为 0 到 180 度之间的数字。
现在我需要给这个角度一个方向(比如说一个符号,如果锐角远离原点,则为负,如果指向中心,则为正),我想我会用以下两种方法之一来实现它,但他们都没有工作。
1)只是“二维叉积的符号”(我知道这不是数学上正确的术语):
//given 3 contiguous vertices a,b,c
//check if b is a inner (+1) or outer (-1) vertex (0 in other cases)
double cross = ((b.x - a.x)*(c.y - a.y)) - ((b.y - a.y)*(c.x - a.x));
if(cross > 0){
return 1;
} else if (cross < 0) {
return -1;
}
return 0;
但它似乎只在左下象限有效,在右上角的工作方式正好相反,而它在其他象限中起作用,我不明白为什么。
2)比较顶点的范数
if b.norm() < a.norm() && b.norm() < c.norm
then return +1
else return -1
这仅适用于基本情况,并且总体上没有穿过轴的折线(包含原点)。我可以检查所有情况,但我宁愿避免这种情况。
显然,有更安全的方法,例如检查顶点是否在原点的同一侧,而不是通过位于 2 个向量上的 2 个邻居之间的线。但我需要尽可能优化它。