hdu 2036(计算多边形的面积)

/* * 题目要求:计算多边形面积 * 方法:把n多边形分割成n-2个三角形,分别求和,然后相加 * 注意:分割的所有三角形有一个公共的顶点,这里选择0点位公共点 * 注:题中给出的点的顺序为逆时针 * auther:Try86 */ /* * 叉乘的性质:设两向量P和Q * 1.P ×Q > 0 则Q在P的逆时针方向 * 2.P ×Q < 0 则Q在P的顺时针方向 * 3.P ×Q = 0 则Q和P共线,方向可能相同也可能不相同 */ /* * 实现一 */ #include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; const int N = 100; struct point { double x; double y; }p[N]; double crossProd(point A, point B, point C) {//叉乘求平行四边形的有向面积 return (B.x-A.x)*(C.y-A.y) - (C.x-A.x)*(B.y-A.y); } double compArea(int n) {//求面积 double area = 0; for (int i=2; i<n; ++i) area += crossProd(p[0], p[i-1], p[i]); // return fabs(area) * 0.5; return area * 0.5; } int main() { int n; while (scanf("%d", &n), n) { for (int i=0; i<n; ++i) scanf("%lf%lf", &p[i].x, &p[i].y); double area = compArea(n); printf ("%.1lf\n", area); } return 0; } /* * 实现二 */ #include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; const int N = 100; struct point { double x; double y; }p[N]; double crossProd(point A, point B) { return A.x*B.y - B.x*A.y; } double compArea(int n) { double area = 0; p[n].x = p[0].x; p[n].y = p[0].y; for (int i=0; i<n; ++i) area += crossProd(p[i], p[i+1]); return fabs(area) * 0.5; } int main() { int n; while (scanf("%d", &n), n) { for (int i=0; i<n; ++i) scanf ("%lf%lf", &p[i].x, &p[i].y); double area = compArea(n); printf ("%.1lf\n", area); } return 0; }