多边形相交面积模板

  1 /*
  2     类型:多边形相交面积模板
  3 */
  4
  5 #include<cstdio>
  6 #include<iostream>
  7 #include<algorithm>
  8 #include<cstring>
  9 #include<cmath>
 10 using namespace std;
 11 #define maxn 510
 12 const double eps=1E-8;
 13 int sig(double d){
 14     return(d>eps)-(d<-eps);
 15 }
 16 struct Point{
 17     double x,y; Point(){}
 18     Point(double x,double y):x(x),y(y){}
 19     bool operator==(const Point&p)const{
 20         return sig(x-p.x)==0&&sig(y-p.y)==0;
 21     }
 22 };
 23 double cross(Point o,Point a,Point b){
 24     return(a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
 25 }
 26 double area(Point* ps,int n){
 27     ps[n]=ps[0];
 28     double res=0;
 29     for(int i=0;i<n;i++){
 30         res+=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x;
 31     }
 32     return res/2.0;
 33 }
 34 int lineCross(Point a,Point b,Point c,Point d,Point&p){
 35     double s1,s2;
 36     s1=cross(a,b,c);
 37     s2=cross(a,b,d);
 38     if(sig(s1)==0&&sig(s2)==0) return 2;
 39     if(sig(s2-s1)==0) return 0;
 40     p.x=(c.x*s2-d.x*s1)/(s2-s1);
 41     p.y=(c.y*s2-d.y*s1)/(s2-s1);
 42     return 1;
 43 }
 44 //多边形切割
 45 //用直线ab切割多边形p,切割后的在向量(a,b)的左侧,并原地保存切割结果
 46 //如果退化为一个点,也会返回去,此时n为1
 47 void polygon_cut(Point*p,int&n,Point a,Point b){
 48     static Point pp[maxn];
 49     int m=0;p[n]=p[0];
 50     for(int i=0;i<n;i++){
 51         if(sig(cross(a,b,p[i]))>0) pp[m++]=p[i];
 52         if(sig(cross(a,b,p[i]))!=sig(cross(a,b,p[i+1])))
 53             lineCross(a,b,p[i],p[i+1],pp[m++]);
 54     }
 55     n=0;
 56     for(int i=0;i<m;i++)
 57         if(!i||!(pp[i]==pp[i-1]))
 58             p[n++]=pp[i];
 59     while(n>1&&p[n-1]==p[0])n--;
 60 }
 61 //---------------华丽的分隔线-----------------//
 62 //返回三角形oab和三角形ocd的有向交面积,o是原点//
 63 double intersectArea(Point a,Point b,Point c,Point d){
 64     Point o(0,0);
 65     int s1=sig(cross(o,a,b));
 66     int s2=sig(cross(o,c,d));
 67     if(s1==0||s2==0)return 0.0;//退化,面积为0
 68     if(s1==-1) swap(a,b);
 69     if(s2==-1) swap(c,d);
 70     Point p[10]={o,a,b};
 71     int n=3;
 72     polygon_cut(p,n,o,c);
 73     polygon_cut(p,n,c,d);
 74     polygon_cut(p,n,d,o);
 75     double res=fabs(area(p,n));
 76     if(s1*s2==-1) res=-res;return res;
 77 }
 78 //求两多边形的交面积
 79 double intersectArea(Point*ps1,int n1,Point*ps2,int n2){
 80     if(area(ps1,n1)<0) reverse(ps1,ps1+n1);
 81     if(area(ps2,n2)<0) reverse(ps2,ps2+n2);
 82     ps1[n1]=ps1[0];
 83     ps2[n2]=ps2[0];
 84     double res=0;
 85     for(int i=0;i<n1;i++){
 86         for(int j=0;j<n2;j++){
 87             res+=intersectArea(ps1[i],ps1[i+1],ps2[j],ps2[j+1]);
 88         }
 89     }
 90     return res;//assumeresispositive!
 91 }
 92 //hdu-3060求两个任意简单多边形的并面积
 93 Point ps1[maxn],ps2[maxn];
 94 int n1,n2;
 95 int main(){
 96     while(scanf("%d%d",&n1,&n2)!=EOF){
 97         for(int i=0;i<n1;i++)
 98             scanf("%lf%lf",&ps1[i].x,&ps1[i].y);
 99         for(int i=0;i<n2;i++)
100             scanf("%lf%lf",&ps2[i].x,&ps2[i].y);
101         double ans=intersectArea(ps1,n1,ps2,n2);
102         ans=fabs(area(ps1,n1))+fabs(area(ps2,n2))-ans;//容斥
103         printf("%.2f\n",ans);
104     }
105     return 0;
106 }  
时间: 2024-08-16 17:26:20

多边形相交面积模板的相关文章

hdu5130Signal Interference(圆与多边形相交面积模板)

#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include

hdu3060Area2(任意多边形相交面积)

链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多边形,因此可以直接用凸多边形相交求面积的模板. 凸多边形相交后的部分肯定还是凸多边形,所以只需要判断哪些点是相交部分上的点,最后求下面积. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inc

求两圆相交面积模板

#define PI 3.141592654 #define eps 1e-8 double getdis(int x1,int y1,int x2,int y2){ return sqrt((double)(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } double getarea(int x1,int y1,double r1,int x2,int y2,double r2){ double d=getdis(x1,y1,x2,y2); if(r1+r2<d+eps)

codevs:1249 多边形的面积(多边形面积计算模板)

题目描述 Description 给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的.要求计算多边形的面积. 多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一.然后按逆时针方向给出各顶点的坐标值.所有的坐标值都是整数(因此多边形的面积也为整数). 输入描述 Input Description 输入文件第一行给出多边形的顶点数n(n≤100).接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开).顶点按逆时针方向逐个给出.并且多边形的每一

zoj 1010 (线段相交判断+多边形求面积)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10 Area Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Jerry, a middle school student, addicts himself to mathematical research. Maybe the problems he has thought are

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

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

zoj 1081 Points Within 判断点是否在任意多边形内(模板)

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81 分析: 从p点出发做平行于x轴的射线 l. 求射线与 多边形 线段的交点数num, 若是偶数 , 该点 在外, 若为奇数, 该点在内. 注意: 两个特判, 1:   一个是 射线 l 与 多边形的边  重合 , 若该p点在 线段上, 返回1, 否则 交点 记为 0 个 2: 一个是 射线与 线段的交点 ,为线段的端点, 则我们 对线段的 较低交点 不计算. 代码

计算DXFReader中多边形的面积代码示例

在DXFReader中, 一般的多边形的面积计算绝对值 其中K表是顶点的数目,它们的坐标,用于在求和和, 所以用下面的代码就可以计算出一个封闭的多段线的区域: view source print? 01 Dim Vertex As Object 02 Dim Entity As Object 03 Dim k As Long 04 Dim i As Long 05 Dim Area As Single 06 07 With DXFReader1 08 09  For Each Entity In

多边形的面积

目录 第1章多边形的面积    1 1.1 三角形面积    1 1.2 多边形面积    2 1.3 递推公式    3 1.4 精度评定    4 第2章坡面面积    6 2.1 坡面面积    6 2.2 模型验算    7 第1章多边形的面积 1.1 三角形面积 xy平面内,有三角形123,如下图所示: 图1.1 借助矢量叉积和点积,这个三角形的面积公式非常简单: 这个面积是有符号的:1.2.3逆时针排列,则面积为正:1.2.3顺时针排列,则面积为负.这是对右手系的总结,如果从背面看这