给定边长的网格多边形区域

时间:2015-01-18 13:02:50

标签: algorithm language-agnostic geometry

输入:

包含32位整数的长度为N(N <= 10000)的表T.每个整数表示方形网格上多边形的连续边的长度和方向(每个顶点具有整数坐标)。如果整数为正,则表示边沿向上或向右。如果整数为负,则边缘向下或向左。边缘与其邻居垂直。边缘不相交或相互重叠。顶点不会相互重叠。

示例输入T:

2,-3,-1,1,-1,2

表示两个多边形(我们将选择哪一个并不重要):

enter image description here

箭头表示 第一个边缘对应于T中的前两个。

输出:

整数表示给定多边形的表面区域。对于示例性输入,输出应为5。

期望的时间复杂度:O(N)
期望的内存复杂性(不计入输入):O(1)

你能提出这样的算法和理由吗?

1 个答案:

答案 0 :(得分:2)

算法:

int area(int[] T) {
    int area = 0;
    int x = 0;
    for (int i = 0; i < T.length; i += 2) {
        x += t[i];
        area += x * t[i + 1];
    }
    return Math.abs(area);
}

说明

我们的多边形在一个大矩形中关闭。基于此,我们计算构建我们形状的小矩形区域 - 矩形在多边形内部以及外部的矩形(具有相反的符号)。

从我们开始的多边形中的哪个顶点开始并不重要。 在开始时,我们需要一个基线,我们将从中计算垂直(它也可以是水平的,并不重要)顶点的平移。 我们得到第一个数字 - 它将告诉我们,从基线到我们的第一个顶点移动了多少。第二个数字是根据第二个坐标的平移。通过乘以这一对,我们得到了总和中的第一个矩形。

第三个和第四个点描述了第二个矩形:

  • 添加到第一个数字的第三个数字是顶点的垂直平移

  • 第四个数字是顶点的水平平移。 将这些点相乘可以得到第二个矩形。

我们将继续为表格中的其他数字执行此操作。我们正在添加矩形区域。结果是总和的绝对值。