多边形面积[nyoj 1011,hdu 2036]

来源:互联网 发布:sql的链接服务器 编辑:程序博客网 时间:2024/05/16 06:13

nyoj 1101 So Easy[II]: click here

hdu 2036 改革春风吹满地:click here

 求多边形的面积的方法:

 就是利用叉积的几何意义:以两向量为邻边的平行四边形的有向面积。

nyoj 这道题是按顺时针给出的点。而hdu上的按逆时针的顺序给出的。 最后有一个绝对值判断,使得求出的面积都是正的。

代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 1e2 + 4;struct Point{    double x, y;}p[N];struct Vector{    double x, y;};double operator *(Vector a, Vector b){    return a.x * b.y - b.x * a.y;}int n;double f(){    double sum = 0;    Vector a, b;    for(int i = 1; i < n - 1; i ++){        a.x = p[i].x - p[0].x; a.y = p[i].y - p[0].y;        b.x = p[i + 1].x - p[0].x; b.y = p[i + 1].y - p[0].y;        sum += (a * b) * 0.5;    }    return sum;}int main(){    while(~scanf("%d",&n)){        for(int i = 0; i < n; i ++){            scanf("%lf %lf", &p[i].x, &p[i].y);        }        double ans = f();        printf("%.2lf\n", fabs(ans));    }    return 0;}另二种解法: #include <stdio.h>#include <stdlib.h>#include <math.h>const int MAXN = 100 + 10;struct Point{   double x,y;}p[MAXN];int N;int main(){    while(~scanf("%d",&N))    {        int j;        double area = 0;        for(int i = 0;i < N;++i)            scanf("%lf%lf",&p[i].x,&p[i].y);        for(int i = 0;i < N;++i){            j = (i+1)%N;            area += p[i].x*p[j].y;            area -= p[i].y*p[j].x;        }        area /= 2.0;        printf("%.2lf\n",area > 0?area:-area);    }    return 0;}        
#include<stdio.h>typedef struct point{int x;int y;}Point;Point p[101];int main(){int n,i;while(scanf("%d",&n)&&n){double area=0;for(i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y);for(i=0;i<n-1;i++)area=area+0.5*(p[i].x*p[i+1].y-p[i+1].x*p[i].y);area=area+0.5*(p[n-1].x*p[0].y-p[0].x*p[n-1].y);printf("%0.1lf\n",area);}return 0;}




0 0
原创粉丝点击