日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求任意多边形面积-有向面积

發布時間:2023/12/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求任意多边形面积-有向面积 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


給定多邊形的頂點坐標(有序),讓你來求這個多邊形的面積,你會怎么做?
我們知道,任意多邊形都可以分割為N個三角形,所以,如果以這為突破點,那么我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最后累加就可以了,把多邊形分割為三角形的方式多種多樣,在這里,我們按照如下圖的方法分割:

圖1

S點作為起始點(點1),a->e依次作為點2,3……。
一個三角形的面積是怎樣的呢?
根據線性代數的知識,我們有如下的三角形面積公式,稱之為有向面積(signed area):

將這個行列式以第三列展開可以得到:

這就是以點1、2、3構成的三角形的有向面積(點如果是順時針給出,有向面積為負,逆時針給出,有向面積為正),那么繼續我們的工作,通過三角形的面積公式,來得到多邊形的面積公式:
對于圖1而言,多邊形的面積就是:
S(1->6)=S(1,2,3)+S(1,3,4)+S(1,4,5)+S(1,5,6)
這里我們不免有些疑問,第一,圖1所給出的是凸多邊形,那這種算法對于非凸多邊形是否同樣適用呢?比如下面這個最簡單的凸多邊形的圖形:

圖2

用剛才的劃分方法的話,就會出現一個詭異的問題,那就是有一個三角形出現在了圖形的外面,而另外一個又超出了多邊形的范圍(劃分為了Sab,Sbc兩個圖形),那么這樣再用剛才的公式求面積,結果還是正確的么?
S(1->4)=S(1,2,3)+S(1,3,4)
先公布結論,這個式子是正確的,等等,為什么?還記得剛才我提到了那個“有向面積”的概念么?忘了的話,請回頭看看加重了的字。
請注意從圖中看,Sab點為順時針排列,Sbc點為逆時針排列,面積從數值上就是從Sab這個超過范圍的大三角形中去掉Sbc這個小三角形,最后的結果神奇的就是多邊形Sabc的面積,那么這個結論能否推廣到任意多邊形呢?

圖3

在這里不做證明,下面給出的公式,就是任意多邊形的面積公式:

題目:hdu2036???? http://acm.hdu.edu.cn/showproblem.php?pid=2036

//任意多邊形的面積計算

#include <iostream>
#include <utility>
#include <cmath>
using std::cout;
using std::cin;
using std::endl;

typedef std::pair<double ,double> point;

#pragma warning(disable:4244)

double det(point p0,point p1,point p2)
{
?return (p1.first-p0.first)*(p2.second-p0.second)-(p1.second-p0.second)*(p2.first-p0.first);
}

double ploygon_area(int n,point p[])?
{
?double s=0.0f;
?int i=1;
?for(;i < n-1;i++)
??s += det(p[0],p[i],p[i+1]);
?return 0.5*fabs(s);
}

int main(int argc, char *argv[])
{

?int i,n;
?double s;
?point *points = NULL;

?cout<<"Enter the number of edges of the polygon <n>:";
?cin>>n;
?if(n < 2){
??exit(1);
?}

?points = (point *)malloc(n*sizeof(point));

?for(i=0; i<n; i++){
??cout<<endl<<"points["<<i<<"]=";
??cin>>points[i].first>>points[i].second;
?}

?s=ploygon_area(n, points);
?cout<<"The area is:"<<s<<std::endl;

?if(points)
??free(points);

?return 1;
}

代碼大家可以自行修改,主要看公式

總結

以上是生活随笔為你收集整理的求任意多边形面积-有向面积的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。