值得注意的是,这不是作业,我也不在寻找代码。我希望找到一种方法的描述,以便能实现自己的方法。我有一些想法,比如从点集合中获取三角形序列,但是我知道对于凸多边形和凹多边形之类的特殊情况可能会出现问题。
与语言无关的解决方案:
假设:一个多边形总是可以由n-2个不重叠的三角形组成(n=点或边的数量)。1个三角形=3边形=1个三角形;1个正方形=4边形=2个三角形;等等。QED
因此,一个多边形可以通过“削减”三角形来缩小,总面积将是这些三角形面积的总和。用一张纸和剪刀试试,最好在跟随之前能够想象出这个过程。
如果你在多边形路径中取任意3个连续点,并用这些点创建一个三角形,你将只有三种可能的情况之一:
我们只对第一种情况感兴趣(完全包含的情况)。
每次我们发现其中之一时,我们就将其削减,计算其面积(公式很简单,这里不再解释),并制作一个边少一个的新多边形(相当于去掉这个三角形的多边形)。直到只剩下一个三角形。
如何以编程方式实现:
创建一个由(连续的)点组成的数组,表示多边形周围的路径。从点0开始。运行该数组,从点x、x+1和x+2制作三角形(一次一个)。将每个三角形从形状转换为区域,并将其与从多边形创建的区域相交。如果结果交集与原始三角形相同,则该三角形完全包含在多边形中,可以被切掉。从数组中删除x+1并从x=0重新开始。否则(如果三角形在多边形外部[部分或完全]),移动到数组中的下一个点x+1。
此外,如果您想要与地图集成并从地理点开始,则必须首先将其从地理点转换为屏幕点。这需要决定地球形状的建模和公式(尽管我们倾向于认为地球是一个球体,但它实际上是一个不规则的卵形,有凹痕)。有许多模型可用,有关更多信息,请参见维基百科。一个重要问题是是否将该区域视为平面还是曲面。通常,“小”区域,其中点之间的距离最多为几公里,如果考虑平面而不是凸面,则不会产生显着误差。
area = 0;
for (i = 0; i < n; i++) {
i1 = (i + 1) % n;
area += (vertex[i].y + vertex[i1].y) * (vertex[i1].x - vertex[i].x) / 2.0;
}
我的倾向是简单地开始切割三角形。我不认为其他任何方法都能避免变得非常复杂。
取组成多边形的三个连续点。确保角度小于180度。现在你有一个新的三角形,应该很容易计算,从多边形的点列表中删除中间点。重复此过程,直到只剩下三个点。
//don't forget to include cmath for abs function
struct Point{
double x;
double y;
}
// cross_product
double cp(Point a, Point b){ //returns cross product
return a.x*b.y-a.y*b.x;
}
double area(Point * vertices, int n){ //n is number of sides
double sum=0.0;
for(i=0; i<n; i++){
sum+=cp(vertices[i], vertices[(i+1)%n]); //%n is for last triangle
}
return abs(sum)/2.0;
}
如此描述:http://www.wikihow.com/Calculate-the-Area-of-a-Polygon
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 20, 30, 20, 10, 0], 'y': [-10, -10, -10, 0, 10, 30, 20]})
df = df.append(df.loc[0])
first_product = (df['x'].shift(1) * df['y']).fillna(0).sum()
second_product = (df['y'].shift(1) * df['x']).fillna(0).sum()
(first_product - second_product) / 2
600
C语言实现方法:
float areaForPoly(const int numVerts, const Point *verts)
{
Point v2;
float area = 0.0f;
for (int i = 0; i<numVerts; i++){
v2 = verts[(i + 1) % numVerts];
area += verts[i].x*v2.y - verts[i].y*v2.x;
}
return area / 2.0f;
}