題目:輸入乙個點列,順次連線成乙個封閉多邊形,計算多邊形的面積
分析:方法一,計算面積可以考慮定積分的形式,定積分有正有負,順次求和,重複部分相互抵消,最後剩下的總面積的絕對值就是多邊形的面積。
從線性積分後的結果可以容易的看出,直線段的積分實際上就是求該直線段與x軸所圍成的區域的梯形的面積int(p1, p2) = int(k*x + b, p1.x, p2.x) = 0.5 * (p2.x - p1.x) * (p2.y + p1.y), 斜率k = (p1.y - p2.y) / (p1.x - p2.x),截距b = p1.y - k*p1.x;
演算法的複雜度為:o(n),n為頂點的個數。
struct point ;
float linearintegration(const point &p1, const point &p2)
float computepolygonarea(const point points, int length)
area += linearintegration(points[length - 1], points[0]);
return area >= 0.0 ? area : -area;
}
方法二,考慮到平面上知道三角形三個頂點的座標可以運用行列式det直接求解三角形的面積。如p1(x1,y1),p2(x2,y2),p3(x3,y3),則
s(p1, p2, p3) = det[ x1 y1 1; x2 y2 1; x3 y3 1] * 0.5 = [(x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)] * 0.5;
可以在多邊形的平面中任意的找到乙個點,與多邊形的每條邊形成有向三角形,並順次求取有向三角形的面積,再加和,因為是有向面積同上述定積分類似,面積有正有負可抵消重複部分,剩下的面積的絕對值即為多邊形的面積。
struct point
point(float _x, float _y):x(_x),y(_y) {}
};
float compute********area(const point &p1, const point &p2, const point &p3)
float computepolygonareatri(const point points, int length)
area += compute********area(p0, points[length - 1], points[0]);
return area >= 0.0 ? area : -area;
}
ps:某cad公司,筆試
參考:
[1][2]
計算幾何 多邊形面積
彙總篇 計算幾何彙總 規定頂點逆時針方向的多邊形面積為正 取原點0 0,0 s a,b,c,d s o,a,b s o,b,c s o,c,d s o,d,a 圖中o在外部,obc,ocd,oda 全部是正的,加起來構成了5變形 obcda 的面積,但 oab是負面積,因此最後剛好等於 abcd 的...
多邊形面積
點積 a b x1 x2 y1 y2 a b cos 點積的結果是乙個數值 叉積 a b x1 y2 x2 y1 a b sin 叉積的結果也是乙個向量,是垂直於向量a,b所形成的平面,如果看成三維座標的話是在 z 軸上,上面結果是它的模。三角形的面積 向量a和 向量b的叉積的絕對值表示 以 向量a...
多邊形的面積
1 三角形面積 xy平面內,有三角形 123,如下圖所示 1 借助向量叉積和點積,這個三角形的面積公式非常簡單 這個面積是有符號的 1 2 3逆時針排列,則面積為正 1 2 3順時針排列,則面積為負。這是對右手系的總結,如果從背面看這個座標系就成了左手系。在左手系下,面積的正負情況正好相反。所以,關...