ZOJ 1010 Area 求任意多边形面积

主要判断是否是多边形:1、n<3 ; 2、非相邻两条线段不相交

#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;
#define eps 1e-8
int sig(double x)
{
    if(x<-eps) return -1;
    if(x>eps) return 1;
    return 0;
}
struct point
{
    double x,y;
} p[1005];

struct line
{
    point p;
    point q;
    line()
    {

    }
    line(point aa,point bb)
    {
        p=aa;
        q=bb;
    }
};
int inside(point o,line L)
{
    double xl=min(L.p.x,L.q.x);
    double xr=max(L.p.x,L.q.x);
    double yl=min(L.p.y,L.q.y);
    double yr=max(L.p.y,L.q.y);
    if(sig(o.x-xl)>=0&&sig(xr-o.x)>=0&&sig(o.y-yl)>=0&&sig(yr-o.y)>=0)
        return 1;
    else
        return 0;
}

int banana(line u,line v)
{
    point ret=u.p;
    double t=((u.p.x-v.p.x)*(v.p.y-v.q.y)-(u.p.y-v.p.y)*(v.p.x-v.q.x))/((u.p.x-u.q.x)*(v.p.y-v.q.y)-(u.p.y-u.q.y)*(v.p.x-v.q.x));
    ret.x+=(u.q.x-u.p.x)*t;
    ret.y+=(u.q.y-u.p.y)*t;
    if(inside(ret,u)&&inside(ret,v)) return 1;
    return 0;
}
double det(point p0,point p1,point p2)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
//求多边形面积
double ploygon_area(int n)
{
    double s=0.0;
    for(int i=1; i < n-1; i++)
        s += det(p[0],p[i],p[i+1]);
    return 0.5*fabs(s);
}

int main()
{
    int i,n,ca=1,j,yy=0;
    while(scanf("%d",&n)!=EOF,n)
    {
        for(i=0; i<n; i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        if(yy==1) printf("\n");
        yy=1;
        printf("Figure %d: ",ca++);
        if(n<3)
        {
            printf("Impossible\n");
            continue;
        }
        p[n]=p[0];
        int flag=0;
        for(i=0;i<n;i++)
        {
            for(j=i+2;j<n;j++)
            {
                if(i==(j+1)%n) continue;
                if(banana(line(p[i],p[i+1]),line(p[j],p[j+1]))) {flag=1;break;}
            }
            if(flag) break;
        }
        if(flag)
        {
            printf("Impossible\n");
            continue;
        }
        double ans=ploygon_area(n);
        printf("%.2f\n",ans);
    }
    return 0;
}
时间: 2024-11-15 13:07:31

ZOJ 1010 Area 求任意多边形面积的相关文章

求任意多边形面积 python实现

数学解决方法: 多边形外选取一点,连接各点构成三角形,计算求和......  详细链接  http://blog.csdn.net/hemmingway/article/details/7814494 已知三角形三边长,求三角形面积------>海伦公式  链接:http://www.zybang.com/question/29d209e9732d1f1f6a6de35b94edd3ba.html 由上实现下面python代码   源代码出处  链接: http://blog.csdn.net/

HDU 2036 求任意多边形面积向量叉乘

三角形的面积可以使用向量的叉积来求: 对于 三角形的面积 等于: [(x2 - x1)*(y3 - y1)- ( y2 - y1 ) * ( x3 - x1 )  ] / 2.0 但是面积是有方向的,对于一个多边形,我们任意选取一点(通常选取 0,0),和多边形的定点相连接, 对于顺序排列的顶点,我们求原点和一对相邻的顶点组成的三角形的叉积,将这些叉积的一半累加起来 由于叉积的方向,在多边形外面的部分会抵消,这样就是多边形的面积了. 最后对结果要取绝对值,因为算出来的叉积有可能是负数: 附上例题

zoj 1010 Area 判断线段是否相交(把线段扩充一倍后 好处理) + 多边形求面积

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10 题意:  给定n个点的, 如果这n个点不能形成多边形 以及 n < 3 时, 输出, "Impossible",  否则 输出 多边形的面积. 分析: 这题主要在 分析  n 个点 是否形成 多边形.  枚举 每条边,  看 这条边 是否与 其他 n - 3 条边 不规范相交. (当处理 其他 边时, 我们采用 扩充线段一倍) 代码如下: con

求任意多边形的面积(转)

原文地址:http://blog.csdn.net/sun_shine_/article/details/18799739 给定多边形的顶点坐标(有序),让你来求这个多边形的面积,你会怎么做?我们知道,任意多边形都可以分割为N个三角形,所以,如果以这为突破点,那么我们第一步就是把给定的多边形,分割为数个三角形,分别求面积,最后累加就可以了,把多边形分割为三角形的方式多种多样,在这里,我们按照如下图的方法分割: 图1 S点作为起始点(点1),a->e依次作为点2,3…….一个三角形的面积是怎样的呢

ecnu1624求交集多边形面积

链接 本来在刷hdu的一道题..一直没过,看到谈论区发现有凹的,我这种方法只能过凸多边形的相交面积.. 就找来这道题试下水. 两个凸多边形相交的部分要么没有 要么也是凸多边形,那就可以把这部分单独拿出来极角排序.叉积求面积.这部分的顶点要么p在q内的顶点,要么是q在p内的顶点,要么是两凸多边形的交点. 用到了点在多边形内的判定模板. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inclu

POJ1265——Area(Pick定理+多边形面积)

Area DescriptionBeing well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new research and development facility the company has installed the latest system of surveilla

凸多边形并 [ECNU 1624] 求交集多边形面积

求交集多边形面积 Time Limit:1000MS Memory Limit:30000KB Total Submit:98 Accepted:42 Description 在平面上有两给定的凸多边形,若两凸多边形相交,则它们的交集也是一个凸多边形.若两凸多边形不相交,指的是两凸多边形相离或仅限于边界点与边上相交,则相交面积为0.如图所示: 你的任务是编程给出交集多边形的面积. 两给定的凸多边形按顺时针方向依次给出多边形每个顶点的坐标. Input 输入文件第一行为一整数M,表示第一个凸多边形

eoj1127 计算几何 任意多边形面积

题目:eoj1127 " 改革春风吹满地, 不会算法没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗. 好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块. 这是一块多边形形状的田,原本是Partychen的,现在就准备送给你了.不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地. 发愁了吧?就是要让你知道,

[ZOJ 1010] Area (计算几何)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1010 题目大意:给你n个点,问你顺次连线能否连成多边形?如果能,就输出多边形面积. 面积用向量的叉积去算.然后能否连成多边形就是看这条线跟之前的线有没有交点. 这些在大白书上都有板子.. 代码: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <string> 4 #include