如何使用正交多边形的内部区域确定边是顶部,底部,右侧还是左侧?

问题描述 投票:0回答:1

我对正交多边形的边缘有疑问。我的目标是确定边缘是否为顶部边缘(这意味着多边形的内部位于下方),底部边缘(这意味着多边形的内部位于上方),右边缘(多边形的内部位于左侧)或左边缘(多边形的内部为右)。

我有多边形的坐标,并按逆时针方向对其进行了排序(因为这是通常的推荐方式)。

我编写了一些代码来计算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); 
} 

...运作良好。但是我完全不知道如何使用它来计算或确定边缘(例如,由其顶部和底部点定义的垂直边缘)是左边缘(内部为右)还是右边缘(内部为左)。

也许还有一种更简单的解决方案。但是,如果有人可以给我一些解决问题的建议,我将不胜感激。

java polygon edges orthogonal
1个回答
1
投票

如果我正确理解了您的问题(图表将有所帮助),则可以通过比较顺序来获得相对于简单(无自交)正交多边形的每个边的位置(顶部,底部,左侧,右侧) 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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.