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;

}

 

你可能感兴趣的:(HDU)