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


求交集多边形面积

Time Limit:1000MS Memory Limit:30000KB Total Submit:98 Accepted:42

Description 
在平面上有两给定的凸多边形,若两凸多边形相交,则它们的交集也是一个凸多边形。若两凸多边形不相交,指的是两凸多边形相离或仅限于边界点与边上相交,则相交面积为0。如图所示: 你的任务是编程给出交集多边形的面积。 两给定的凸多边形按顺时针方向依次给出多边形每个顶点的坐标。

Input 
输入文件第一行为一整数M,表示第一个凸多边形的边数,以后M行分别给出了M个顶点的坐标;接着,给出第二个凸多边形的边数N,以后N行分别给出了N个顶点的坐标。

Output 
只一个数据即交集面积,保留两位小数点。

Sample Input 
4

0 0

0 1

1 1

1 0

4

-0.5 -0.5

-0.5 0.5

0.5 0.5

0.5 -0.5

Sample Output 
0.25

半平面交、不确定是不是对的、- -

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define EPS 1e-8
#define N 1010

int n;
int dq[N];
int top,bot,pn;

int dump(double x)
{
    if(fabs(x)<EPS) return 0;
    return x>0?1:-1;
}

struct Point
{
    double x,y;
    Point (){}
    Point (double x,double y):x(x),y(y){}
    Point operator - (Point p){
        return Point(x-p.x,y-p.y);
    }
    Point operator + (Point p){
        return Point(x+p.x,y+p.y);
    }
    Point operator * (double d){
        return Point(x*d,y*d);
    }
    double operator ^ (Point p){
        return x*p.y-y*p.x;
    }
};

struct Line
{
    Point s,e;
    double k;
    Line(){}
    Line(Point s,Point e):s(s),e(e){
        k=atan2(e.y-s.y,e.x-s.x);
    }
    Point operator & (Line l){
        return s+(e-s)*(((l.e-l.s)^(l.s-s))/((l.e-l.s)^(e-s)));
    }
};

Line l[N];
Point p[N];

bool HPIcmp(Line a,Line b)
{
    int d=dump(a.k-b.k);
    if(!d) return dump((b.s-a.s)^(b.e-a.s))>0;
    return d<0;
}

bool Judge(Line a,Line b,Line c)
{
    Point p=b&c;
    return dump((a.s-p)^(a.e-p))<0;
}

void HPI(int n)
{
    int i,j;
    sort(l,l+n,HPIcmp);
    for(i=0,j=0;i<n;i++)
    {
        if(dump(l[i].k-l[j].k)>0) l[++j]=l[i];
    }
    n=j+1;
    dq[0]=0;
    dq[1]=1;
    top=1;
    bot=0;
    for(i=2;i<n;i++)
    {
        while(top>bot && Judge(l[i],l[dq[top]],l[dq[top-1]])) top--;
        while(top>bot && Judge(l[i],l[dq[bot]],l[dq[bot+1]])) bot++;
        dq[++top]=i;
    }
    while(top>bot && Judge(l[dq[bot]],l[dq[top]],l[dq[top-1]])) top--;
    while(top>bot && Judge(l[dq[top]],l[dq[bot]],l[dq[bot+1]])) bot++;
    dq[++top]=dq[bot];
    for(pn=0,i=bot;i<top;i++,pn++)
    {
        p[pn]=l[dq[i+1]]&l[dq[i]];
    }
}

double GetArea()
{
    double marea=0;
    if(pn<3) return 0;
    for(int i=2;i<pn;i++)
    {
        marea+=(p[i]-p[0])^(p[i-1]-p[0]);
    }
    return fabs(marea)/2;
}

int main()
{
    int n,m,tot;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        tot=0;
        Point p1[N],p2[N];
        for(int i=0;i<n;i++) scanf("%lf%lf",&p1[i].x,&p1[i].y);
        for(int i=0;i<m;i++) scanf("%lf%lf",&p2[i].x,&p2[i].y);
        for(int i=0;i<n;i++) l[tot++]=Line(p1[i],p1[(i-1+n)%n]);
        for(int i=0;i<m;i++) l[tot++]=Line(p2[i],p2[(i-1+m)%m]);
        HPI(tot);
        printf("%.2f\n",GetArea());
    }
    return 0;
}
时间: 2024-10-14 04:26:56

凸多边形并 [ECNU 1624] 求交集多边形面积的相关文章

ecnu1624求交集多边形面积

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

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; }

求任意多边形面积 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),和多边形的定点相连接, 对于顺序排列的顶点,我们求原点和一对相邻的顶点组成的三角形的叉积,将这些叉积的一半累加起来 由于叉积的方向,在多边形外面的部分会抵消,这样就是多边形的面积了. 最后对结果要取绝对值,因为算出来的叉积有可能是负数: 附上例题

poj 1654 Area(求多边形面积)

题意:从原点出发向八个方向走,所给数字串每个数字代表一个方向,终点与原点连线,求所得多边形面积: 思路:(性质)共起点的两向量叉积的一半为两向量围成三角形的面积.以此计算每条边首尾两个向量的叉积,求和,除二: #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const dou

EOJ 1058. 挤模具 (多边形面积)

题目链接:1058. 挤模具 题意 给出模具的底和体积,求模具的高. 思路 模具的底为多边形,因此求出多边形面积,用体积除以底的面积就是答案. 多边形的面积求解见 EOJ 1127. 多边形面积(计算几何) 代码 #include <cstdio> #include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; typ

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

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

poj 3348 Cows 凸包 求多边形面积 计算几何 难度:0 Source:CCC207

Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7038   Accepted: 3242 Description Your friend to the south is interested in building fences and turning plowshares into swords. In order to help with his overseas adventure, they are f

三角剖分求多边形面积的交 HDU3060

1 //三角剖分求多边形面积的交 HDU3060 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <stack> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace std; 11 12 const int max