中文字幕在线亚洲三区|亚洲人成在线免费观看|亚洲h片91免费看国产|国产精品v一区二区三区|亚洲一区二区在线观看网址|亚洲欧美中文字幕在线一区|日本TS人妖系列在线专区|日本一区二区三区dvd视频在线

?
當(dāng)前位置: 首頁(yè) >> 地理信息系統(tǒng) >>

任意多邊形面積—有向面積

0
版權(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
?

Powered by DLKIT 開(kāi)發(fā)版 ? 2011-2012 DLCMS.NET Inc.
Copyright ? 2017-2024 南充辰汐科技有限公司

住所:南充市順慶區(qū)油院路30號(hào)南充高新孵化園內(nèi)

聯(lián)系人:劉義君

聯(lián)系電話:18781755505(微信同號(hào))

QQ:23424830

Email : 23424830@QQ.com