我对正交多边形的边缘有疑问。我的目标是确定边缘是否为顶部边缘(这意味着多边形的内部位于下方),底部边缘(这意味着多边形的内部位于上方),右边缘(多边形的内部位于左侧)或左边缘(多边形的内部为右)。
我有多边形的坐标,并按逆时针方向对其进行了排序(因为这是通常的推荐方式)。
我编写了一些代码来计算Java中多边形的内部。
[...]
public static double polygonArea(double X[], double Y[], int n)
{
// Initialze area double area = 0.0; `
// Calculate value of shoelace formula
int j = n - 1;
for (int i = 0; i < n; i++)
{
area += (X[j] + X[i]) * (Y[j] - Y[i]);
// j is previous vertex to i
j = i;
}
// Return absolute value
return Math.abs(area / 2.0);
}
...运作良好。但是我完全不知道如何使用它来计算或确定边缘(例如,由其顶部和底部点定义的垂直边缘)是左边缘(内部为右)还是右边缘(内部为左)。
也许还有一种更简单的解决方案。但是,如果有人可以给我一些解决问题的建议,我将不胜感激。
如果我正确理解了您的问题(图表将有所帮助),则可以通过比较顺序来获得相对于简单(无自交)正交多边形的每个边的位置(顶部,底部,左侧,右侧) x(水平)或y(垂直)的坐标。
显然,点的顺序很重要,所以对于逆时针多边形,您可以使用如下所示的东西:
enum EdgeType {TOP, BOTTOM, LEFT, RIGHT, EMPTY}
public EdgeType orthoEdgeTypeCCW(double x0, double y0, double x1, double y1)
{
if(x0 == x1) // vertical
{
return (y0 < y1) ? EdgeType.RIGHT :
(y0 > y1) ? EdgeType.LEFT :
EdgeType.EMPTY;
}
else if(y0 == y1) // horizontal
{
return (x0 < x1) ? EdgeType.BOTTOM :
(x0 > x1) ? EdgeType.TOP :
EdgeType.EMPTY;
}
else
{
throw new IllegalArgumentException("Edge not orthogonal");
}
}