1. 程式人生 > >求任意多邊形面積(模板題)

求任意多邊形面積(模板題)

題目描述

眾所周知的是,小X特別喜歡由線條組成的形狀,比如說凸多邊形,這一天小X正在紙上畫著喜歡的凸多邊形,這時候小Y走了過來,指著一張圖片上的多邊形,問小X知道這個圖形的面積麼,這可把小X難住了,聰明的你一定能夠幫助小X解決這個問題,對吧~

輸入描述:

多邊形上最多有六個點,順時針or逆時針給定每個點座標(兩個整數表示),保證無多餘的點並且沒有點重複。

輸出描述:

輸出一個整數,表示凸多邊形的面積,結果四捨五入。

示例1

輸入

3

0 0

1 0

2 2

輸出

1

示例2

輸入

5

-4 -2

1 -3

3 2

-1 4

-4 2

輸出

35

題意:求多邊形面積。

還有一種特殊情況的多邊形求面積:Pick公式:前提條件(以整點為頂點的任意多邊形),它內部整點數為a,它的邊上(包括頂點)的整點數為b,則它的面積S = a+b/2-1。證明推導:https://www.cnblogs.com/yujunyong/articles/2010482.html

有前提條件,所以使用有範圍限制,但在滿足條件時使用比叉積方便。

程式碼如下(模板):

#include <bits/stdc++.h>
using namespace std;
const int maxn=0x3f3f3f;
struct node
{
	double x;
	double y;
}p[maxn];  
int n;  
double fun(node a,node b) 
{ 
    return a.x*b.y-a.y*b.x;  
}  
int main()  
{  
    while(scanf("%d", &n)!=EOF&&n!=0) 
	{  
        for(int i=0;i<n;i++)   
        scanf("%lf %lf",&p[i].x,&p[i].y);  
        double sum=0;  
        p[n].x=p[0].x;  
        p[n].y=p[0].y;  
        for(int i=0;i<n;i++) 
		{   
            sum+=fun(p[i],p[i+1]);  
        }  
        sum=sum/2.0;  
        printf("%.1f\n",abs(sum));//面積一定是正數  
    }    
    return 0;  
}