任意多邊形面積—有向面積
作者:dlcms 瀏覽量:1502 次 發(fā)布時(shí)間:2019-10-29 04:06:26
版權(quán)聲明:本文為轉(zhuǎn)載文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_41939839/article/details/81296550
給定多邊形的頂點(diǎn)坐標(biāo)(有序),讓你來(lái)求這個(gè)多邊形的面積,你會(huì)怎么做?
我們知道,任意多邊形都可以分割為N個(gè)三角形,所以,如果以這為突破點(diǎn),那么我們第一步就是把給定的多邊形,分割為數(shù)個(gè)三角形,分別求面積,最后累加就可以了,把多邊形分割為三角形的方式多種多樣,在這里,我們按照如下圖的方法分割:
(點(diǎn)如果是順時(shí)針給出,有向面積為負(fù),逆時(shí)針給出,有向面積為正)
對(duì)于圖1而言,多邊形的面積就是:
S(1->6)=S(1,2,3)+S(1,3,4)+S(1,4,5)+S(1,5,6)(對(duì)凸多邊形同樣適用)
如果我們不以多邊形的某一點(diǎn)為頂點(diǎn)來(lái)劃分三角形而是以任意一點(diǎn),如下圖,這個(gè)方法也是成立的:S = S_OAB + S_OBC + S_OCD + S_ODE + S_OEA。計(jì)算的時(shí)候,當(dāng)我們?nèi)點(diǎn)為原點(diǎn)時(shí),可以簡(jiǎn)化計(jì)算。
當(dāng)O點(diǎn)為原點(diǎn)時(shí),根據(jù)向量的叉積計(jì)算公式,各個(gè)三角形的面積計(jì)算如下:
設(shè)a(x1,y1),b(x2,y2)
以下均為向量:
oa(x1,y1),ob(x2,y2)
oa X ob由線性代數(shù)叉積知識(shí)得:
=x1y2-x2y1
S_OAB = 0.5*(A_x*B_y - A_y*B_x) 【(A_x,A_y)為A點(diǎn)的坐標(biāo)】
S_OBC = 0.5*(B_x*C_y - B_y*C_x)
S_OCD = 0.5*(C_x*D_y - C_y*D_x)
S_ODE = 0.5*(D_x*E_y - D_y*E_x)
S_OEA = 0.5*(E_x*A_y - E_y*A_x)
點(diǎn)如果是順時(shí)針給出,有向面積為負(fù),逆時(shí)針給出,有向面積為正,OAB即為O>A>B,即OA向量XOB向量
無(wú)需擔(dān)心點(diǎn)點(diǎn)坐標(biāo)為正還是負(fù),正負(fù)只與點(diǎn)給出的順序有關(guān),最終結(jié)果取絕對(duì)值即可。
題目:hdu2036 http://acm.hdu.edu.cn/showproblem.php?pid=2036
//輸入必須是將點(diǎn)按順序輸入,順時(shí)還是逆時(shí)程序會(huì)處理的
#include<cstdio>
using namespace std;
double ans;
int n;
struct Point{
int x,y;
}a[1000000];
int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
int main(){
n=read();//共n個(gè)點(diǎn)
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y; //a[i]=(Point){read(),read()};
for(int i=2;i<=n;i++) //取原點(diǎn)為輔助點(diǎn)
ans+=(double)(a[i].x*a[i-1].y-a[i].y*a[i-1].x)/*記得求平行四邊形面積公式嗎*//2.0;
//求三角形面積。全加起來(lái)就好了,因?yàn)?..面積有方向(正負(fù)性),自己會(huì)消掉的
ans+=(double)(a[1].x*a[n].y-a[1].y*a[n].x)/2.0;//第1和第n個(gè)點(diǎn)單獨(dú)處理
if(ans<0.0) ans=-ans;//順時(shí)針與逆時(shí)針輸入結(jié)果互為相反數(shù)
printf("%lf",ans);
return 0;
}
//起點(diǎn)為(0.0)時(shí)
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#define fre freopen("C:UsersDellDesktopin.txt", "r", stdin);
using namespace std;
struct area{
double x;double y;
};
int main(){
//fre;
int t,n;
double sum;
struct area a[109];
cin>>t;
while(t--){
sum=0.0;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
for(int i=1;i<n-1;i++)
sum+=(a[i].x*a[i+1].y-a[i+1].x*a[i].y);
sum=fabs(sum/2.0); //求double絕對(duì)值用fabs,float:fabsf,int:abs
printf("%.6fn",sum);
}
return 0;
}
————————————————
版權(quán)聲明:本文為CSDN博主「這是你從未聽(tīng)過(guò)的名字」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41939839/article/details/81296550
本文鏈接:https://blog.csdn.net/qq_41939839/article/details/81296550
給定多邊形的頂點(diǎn)坐標(biāo)(有序),讓你來(lái)求這個(gè)多邊形的面積,你會(huì)怎么做?
我們知道,任意多邊形都可以分割為N個(gè)三角形,所以,如果以這為突破點(diǎn),那么我們第一步就是把給定的多邊形,分割為數(shù)個(gè)三角形,分別求面積,最后累加就可以了,把多邊形分割為三角形的方式多種多樣,在這里,我們按照如下圖的方法分割:
(點(diǎn)如果是順時(shí)針給出,有向面積為負(fù),逆時(shí)針給出,有向面積為正)
對(duì)于圖1而言,多邊形的面積就是:
S(1->6)=S(1,2,3)+S(1,3,4)+S(1,4,5)+S(1,5,6)(對(duì)凸多邊形同樣適用)
如果我們不以多邊形的某一點(diǎn)為頂點(diǎn)來(lái)劃分三角形而是以任意一點(diǎn),如下圖,這個(gè)方法也是成立的:S = S_OAB + S_OBC + S_OCD + S_ODE + S_OEA。計(jì)算的時(shí)候,當(dāng)我們?nèi)點(diǎn)為原點(diǎn)時(shí),可以簡(jiǎn)化計(jì)算。
當(dāng)O點(diǎn)為原點(diǎn)時(shí),根據(jù)向量的叉積計(jì)算公式,各個(gè)三角形的面積計(jì)算如下:
設(shè)a(x1,y1),b(x2,y2)
以下均為向量:
oa(x1,y1),ob(x2,y2)
oa X ob由線性代數(shù)叉積知識(shí)得:
=x1y2-x2y1
S_OAB = 0.5*(A_x*B_y - A_y*B_x) 【(A_x,A_y)為A點(diǎn)的坐標(biāo)】
S_OBC = 0.5*(B_x*C_y - B_y*C_x)
S_OCD = 0.5*(C_x*D_y - C_y*D_x)
S_ODE = 0.5*(D_x*E_y - D_y*E_x)
S_OEA = 0.5*(E_x*A_y - E_y*A_x)
點(diǎn)如果是順時(shí)針給出,有向面積為負(fù),逆時(shí)針給出,有向面積為正,OAB即為O>A>B,即OA向量XOB向量
無(wú)需擔(dān)心點(diǎn)點(diǎn)坐標(biāo)為正還是負(fù),正負(fù)只與點(diǎn)給出的順序有關(guān),最終結(jié)果取絕對(duì)值即可。
題目:hdu2036 http://acm.hdu.edu.cn/showproblem.php?pid=2036
//輸入必須是將點(diǎn)按順序輸入,順時(shí)還是逆時(shí)程序會(huì)處理的
#include<cstdio>
using namespace std;
double ans;
int n;
struct Point{
int x,y;
}a[1000000];
int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
int main(){
n=read();//共n個(gè)點(diǎn)
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y; //a[i]=(Point){read(),read()};
for(int i=2;i<=n;i++) //取原點(diǎn)為輔助點(diǎn)
ans+=(double)(a[i].x*a[i-1].y-a[i].y*a[i-1].x)/*記得求平行四邊形面積公式嗎*//2.0;
//求三角形面積。全加起來(lái)就好了,因?yàn)?..面積有方向(正負(fù)性),自己會(huì)消掉的
ans+=(double)(a[1].x*a[n].y-a[1].y*a[n].x)/2.0;//第1和第n個(gè)點(diǎn)單獨(dú)處理
if(ans<0.0) ans=-ans;//順時(shí)針與逆時(shí)針輸入結(jié)果互為相反數(shù)
printf("%lf",ans);
return 0;
}
//起點(diǎn)為(0.0)時(shí)
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#define fre freopen("C:UsersDellDesktopin.txt", "r", stdin);
using namespace std;
struct area{
double x;double y;
};
int main(){
//fre;
int t,n;
double sum;
struct area a[109];
cin>>t;
while(t--){
sum=0.0;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
for(int i=1;i<n-1;i++)
sum+=(a[i].x*a[i+1].y-a[i+1].x*a[i].y);
sum=fabs(sum/2.0); //求double絕對(duì)值用fabs,float:fabsf,int:abs
printf("%.6fn",sum);
}
return 0;
}
————————————————
版權(quán)聲明:本文為CSDN博主「這是你從未聽(tīng)過(guò)的名字」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41939839/article/details/81296550
相關(guān)閱讀:
- 辰汐出品高斯正算計(jì)算器 (2019-10-23)
- 白話《關(guān)于在國(guó)土空間規(guī)劃中統(tǒng)籌劃定落實(shí)三條控制線的指導(dǎo)意見(jiàn)》 (2019-11-07)
- COORD 坐標(biāo)系轉(zhuǎn)換 (2017-12-25)
- 這13個(gè)開(kāi)源GIS軟件,你了解幾個(gè)? (2018-09-20)
- 辰汐出品高斯反算計(jì)算器 (2019-10-23)