Java 多边形面积

Java 多边形面积,java,polygon,area,rectangles,Java,Polygon,Area,Rectangles,我需要计算二维多边形的面积。(任何形状、任何尺寸等) 我只有点列表,每个点包含X和Y。 多边形位于二维块贴图中,因此: 但因为我必须使用块/矩形,所以多边形看起来更像: 因此,我们必须计算: 块在区域中,仅当超过50%的块在多边形中或是该多边形的角/点(如图像底部的手臂)时 可以计算吗?无需获取最小和最大点,并检查每个块… 我只找到了一些用于法线多边形的代码: public int getArea(List<BlockVector2D> blockPoints) { doub

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

多边形位于二维块贴图中,因此:
但因为我必须使用块/矩形,所以多边形看起来更像:
因此,我们必须计算:

块在区域中,仅当超过50%的块在多边形中或是该多边形的角/点(如图像底部的手臂)时

可以计算吗?无需获取最小和最大点,并检查每个块…
我只找到了一些用于法线多边形的代码:

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);
}
public int getArea(列出阻塞点)
{
双结果=0;
int j=blockPoints.size()-1;
对于(int i=0;i
但我不知道如何使用积木点



对于大小和奇怪的图像,我深表歉意。。。还有我的英语。

看看这个算法,它有点复杂,但解释了你需要什么


我没有一个完美的解决方案,只是一个想法。。(可能是哑巴,不能保证):

我知道你需要非常快地计算它。沿着每个点进行遍历,如:

area = 0;
foreach(point p : points) {
    area += testIfInsidePolygon(p);
}
这不是一种选择

我相信,对于这个问题,没有一个解析的解决方案能够产生您提供的这么好的算法。所以我的想法是:

  • 沿每个多边形顶点进行遍历,并使用Bresenham的直线算法()计算特定点是否位于多边形的边上
  • 在2D k-d树()中存储点位置,这对于空间分区非常有效
  • 若某个点已经存储在k-d树中,这意味着你们正在处理类似于情人右角点的情况
  • 使用k-d树查找最上面和最下面的点
  • 从最上面的坐标遍历到最下面的坐标,从侧面投射光线,并再次查询k-d树以查找光线多边形边交点
  • 使用交点X坐标之间的差值之和,可以计算面积
极有可能需要特殊情况下的更正:)


这个算法比遍历所有点的O(n^2)快得多。然而,您将付出复杂的代价。

“如果超过50%的块位于多边形中”,在您的示例中,显然情况并非总是如此。。。我猜总是包括一个带角的街区?“对不起尺寸和奇怪的图像…还有我的英语。”不要这样。图片可能很大,但当我们试图想象你在做什么时,它们对我们所有人都非常有帮助。你的英语很好:)我同意tobias_k的观点,我认为如果你尝试计算轮廓线的积分,它会更容易,也更自信。也许这会有帮助:除了角块(不管怎样,角块似乎在多边形中),每个块都超过50%在“内部”多边形当且仅当其中心位于多边形中时。(如果多边形的一个非常薄且尖的“臂”穿过中心,可能会有例外,因为右下角几乎就是这种情况。)或者,您可以使用类似的算法将多边形分割为凸多边形,假设您不必担心自相交。是普林斯顿的一份关于算法的pdf。我认为它相当简单。否则,像我的代码一样使用Monte CarloThat,区域10x10=89块,而不是100块。(p1=(1,1),p2=(1,10),p3=(10,10),p4=(10,1))。我指的是那一页中的“更复杂的情况”部分。