多边形面积

时间:2014-04-17 14:53:18

标签: java polygon area rectangles

我需要计算2D多边形的面积。 (任何形状,任何尺寸等......) 我只有点列表,每个点都包含X和Y.

多边形位于二维块图中,因此: Normal polygon
但是因为我必须使用块/矩形,然后多边形看起来更像: Blocks polygon
所以必须计算一下: Area of polygon
块在区域内,仅当块的多于50%在多边形中时OR是该多边形的角/点(如图像底部的这个臂)。

有可能计算出来吗?没有得到最小点和最大点,并检查每一个块...
我只找到了一些普通多边形的代码:

public int getArea(List<BlockVector2D> blockPoints)
{
    double result = 0;
    int j = blockPoints.size() - 1;

    for (int i = 0; i < blockPoints.size(); ++i)
    {
        result += (blockPoints.get(j).getBlockX() + blockPoints.get(i).getBlockX()) * (blockPoints.get(j).getBlockZ() - blockPoints.get(i).getBlockZ());
        j = i;
    }
    return (int) Math.abs(result / 2);
}

但我不知道如何使用blocks-point ...

左。对不起大小和奇怪的图片......以及我的英文。

2 个答案:

答案 0 :(得分:2)

查看这个算法,它有点复杂,但解释了你需要的东西。

http://www.mathopenref.com/coordpolygonarea2.html

答案 1 :(得分:0)

我没有一个完美的解决方案,只是一个想法......(也许是愚蠢的,不能保证):

我知道你需要非常快速地计算它。所以遍历各个方面,如:

area = 0;
foreach(point p : points) {
    area += testIfInsidePolygon(p);
}

不是一种选择。

我认为没有解决这个问题的分析方法会导致你提供的这种好算法。所以我的想法是:

  • 遍历每个多边形顶点并使用Bresenham的线算法(http://en.wikipedia.org/wiki/Bresenhams_line_algorithm)计算特定点是否位于多边形的边缘
  • 在2D k-d树(http://en.wikipedia.org/wiki/K-d_tree)中存储点位置,这对空间划分非常有效
  • 如果某些点已存储在k-d树中,则表示您正在处理与情人右角点相似的情况
  • 使用k-d树找到最高点和最低点
  • 从最顶部到最低坐标遍历,从侧面投射光线并再次查询k-d树以获得光线&lt; - &gt;多边形边缘交叉点
  • 使用交叉点X坐标之间的差异总和,您可以计算您的面积

极有可能需要进行特殊情况修正:)

该算法比遍历所有点的O(n ^ 2)快得多。但是,您需要付出复杂的代价。