计算多边形顶点的外角

时间:2012-04-01 23:49:58

标签: java math vector polygon

嘿伙计们,这是我正在做的一个功课谜题,我的三角区不是太强,所以请耐心等待。

我有一个三个顶点的列表,我已经弄清楚如何计算它们相遇的内角(我正在使用它进行测试,以确保它们有一个有效的角度,因此多边形是一个有效的多边形)

目前我连续取出三个顶点,然后计算我希望角度打开的顶点的边缘,然后得到该点处矢量积的acos:

            double dx21 = one.x - two.x;
            double dx31 = three.x - two.x;
            double dy21 = one.y - two.y;
            double dy31 = three.y - two.y;
            double m12 = Math.sqrt(dx21*dx21 + dy21*dy21);
            double m13 = Math.sqrt(dx31*dx31 + dy31*dy31);
            double theta = Math.acos((dx21*dx31 + dy21*dy31)/ (m12 * m13));

我知道我可以通过从360度减去内部角度来获取外部角度,但这是一个完整性检查,以确保多边形有效(顶点按逆时针顺序)。

我给出的注释是为了确保顶点处的矢量积的正义是正的,但是我已经在纸上玩了一段时间了,并且我没有运气这么好。< / p>

我知道这主要是一个数学问题,但任何建议都非常有用。

1 个答案:

答案 0 :(得分:2)

以下是一些注释。

首先,通常定义的外角是180度 - 内角,或pi - 内角,取决于你的单位。见here。一个快速的健全检查是将外部角度加在一起,以确保你得到一个圆圈。

其次,你可能知道这一点,但我应该指出Math.acos以弧度而不是度数返回一个角度。

第三,注意余弦不能区分凸角和凹角,这意味着你的内角方法仅对凸多边形有效。您可能最好使用交叉产品,这将为您提供角度的正弦。

最后,回答你的问题,这里有一个提示:你看看p2-> p1和p2-> p3的载体;当我读到这个问题时,我想象了每个来自p1-> p2和p2-> p3的载体。任何一种方法都是解决问题的完美有效方法,但请考虑这些向量对之间的角度是如何不同的,以及它与您的问题的关系。