HDu 2036(多角形の面積を計算)
1591 ワード
Input
入力データには複数のテストインスタンスが含まれており、各テストインスタンスは1行を占め、各行の最初は整数n(3<=n<=100)であり、多角形の辺数(もちろん頂点数)を表し、次いで反時計回りの順序で与えられたn個の頂点の座標(x 1,y 1,x 2,y 2...xn,yn)であり、問題を簡略化するために、ここでのすべての座標は整数で表される.
入力データのすべての整数は32ビット整数の範囲内であり、n=0はデータの終了を示し、処理しない.
Output
各テストインスタンスについて、対応するポリゴン面積を出力し、小数点以下の小数点まで正確にします.
各インスタンスの出力は1行を占めます.
Sample Input
Sample Output
テンプレート~
入力データには複数のテストインスタンスが含まれており、各テストインスタンスは1行を占め、各行の最初は整数n(3<=n<=100)であり、多角形の辺数(もちろん頂点数)を表し、次いで反時計回りの順序で与えられたn個の頂点の座標(x 1,y 1,x 2,y 2...xn,yn)であり、問題を簡略化するために、ここでのすべての座標は整数で表される.
入力データのすべての整数は32ビット整数の範囲内であり、n=0はデータの終了を示し、処理しない.
Output
各テストインスタンスについて、対応するポリゴン面積を出力し、小数点以下の小数点まで正確にします.
各インスタンスの出力は1行を占めます.
Sample Input
3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0
Sample Output
0.5
2.0
テンプレート~
#include <stdio.h>
#include <string.h>
struct Point
{
double x, y;
Point(double x=0, double y=0):x(x), y(y) {}
};
typedef Point Vector;
Point xy[110];
// A B 。
double Cross(Vector A, Vector B) {return A.x*B.y - A.y*B.x; }
// - =
Vector operator - (Point A, Point B) {return Vector(A.x-B.x, A.y-B.y); }
//
double PloygonArea(Point* p, int n)
{
double area = 0;
for(int i=1; i<n-1; i++)
area += Cross(p[i]-p[0], p[i+1] - p[0]);
return area / 2;
}
int main()
{
int n, i;
while(scanf("%d",&n),n)
{
for(i=0; i<n; i++)
scanf("%lf%lf",&xy[i].x,&xy[i].y);
double sum = PloygonArea(xy,n);
printf("%.1lf
",sum);
}
return 0;
}