如何使用内部区域?

我有一个关于正交多边形的边缘的问题,我的目标是决定一条边是顶边(这意味着多边形的内部在下面),还是底边(这意味着多边形的内部在上面),还是右边。我的目标是决定一条边是顶边(这意味着多边形的内部位于下方)、底边(这意味着多边形的内部位于上方)、右边(多边形的内部位于左侧)还是左边(多边形的内部位于右侧)。

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

我用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");
    }
}

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Djnago,是否可以用一个模型创建多个状态选择?

2022-5-11 10:00:16

解决方案

Firebase云函数 - 连接错误

2022-5-11 10:00:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索