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

View Code
/*
* 题目要求:计算多边形面积
* 方法:把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;
}

 

posted on 2012-04-21 21:26  Try86  阅读(156)  评论(0)    收藏  举报