三角剖分求多边形面积的交 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 maxn = 555;
 13 const int maxisn = 10;
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 
 17 int dcmp(double x) {
 18     if(x > eps) return 1;
 19     return x < -eps ? -1 : 0;
 20 }
 21 
 22 struct Point {
 23     double x, y;
 24     Point() {
 25         x = y = 0;
 26     }
 27     Point(double a, double b) {
 28         x = a, y = b;
 29     }
 30     inline Point operator-(const Point &b)const {
 31         return Point(x - b.x, y - b.y);
 32     }
 33     inline Point operator+(const Point &b)const {
 34         return Point(x + b.x, y + b.y);
 35     }
 36     inline double dot(const Point &b)const {
 37         return x * b.x + y * b.y;
 38     }
 39     inline double cross(const Point &b, const Point &c)const {
 40         return (b.x - x) * (c.y - y) - (c.x - x) * (b.y - y);
 41     }
 42 };
 43 
 44 Point LineCross(const Point &a, const Point &b, const Point &c, const Point &d) {
 45     double u = a.cross(b, c), v = b.cross(a, d);
 46     return Point((c.x * v + d.x * u) / (u + v), (c.y * v + d.y * u) / (u + v));
 47 }
 48 
 49 double PolygonArea(Point p[], int n) {
 50     if(n < 3) return 0.0;
 51     double s = p[0].y * (p[n - 1].x - p[1].x);
 52     p[n] = p[0];
 53     for(int i = 1; i < n; ++ i)
 54         s += p[i].y * (p[i - 1].x - p[i + 1].x);
 55     return fabs(s * 0.5);
 56 }
 57 
 58 double CPIA(Point a[], Point b[], int na, int nb) { //ConvexPolygonIntersectArea
 59     Point p[maxisn], tmp[maxisn];
 60     int i, j, tn, sflag, eflag;
 61     a[na] = a[0], b[nb] = b[0];
 62     memcpy(p, b, sizeof(Point) * (nb + 1));
 63     for(i = 0; i < na && nb > 2; ++ i) {
 64         sflag = dcmp(a[i].cross(a[i + 1], p[0]));
 65         for(j = tn = 0; j < nb; ++ j, sflag = eflag) {
 66             if(sflag >= 0) tmp[tn ++] = p[j];
 67             eflag = dcmp(a[i].cross(a[i + 1], p[j + 1]));
 68             if((sflag ^ eflag) == -2)
 69                 tmp[tn ++] = LineCross(a[i], a[i + 1], p[j], p[j + 1]);
 70         }
 71         memcpy(p, tmp, sizeof(Point) * tn);
 72         nb = tn, p[nb] = p[0];
 73     }
 74     if(nb < 3) return 0.0;
 75     return PolygonArea(p, nb);
 76 }
 77 
 78 double SPIA(Point a[], Point b[], int na, int nb) { //SimplePolygonIntersectArea
 79     int i, j;
 80     Point t1[4], t2[4];
 81     double res = 0, if_clock_t1, if_clock_t2;
 82     a[na] = t1[0] = a[0], b[nb] = t2[0] = b[0];
 83     for(i = 2; i < na; ++ i) {
 84         t1[1] = a[i - 1], t1[2] = a[i];
 85         if_clock_t1 = dcmp(t1[0].cross(t1[1], t1[2]));
 86         if(if_clock_t1 < 0) std::swap(t1[1], t1[2]);
 87         for(j = 2; j < nb; ++ j) {
 88             t2[1] = b[j - 1], t2[2] = b[j];
 89             if_clock_t2 = dcmp(t2[0].cross(t2[1], t2[2]));
 90             if(if_clock_t2 < 0) std::swap(t2[1], t2[2]);
 91             res += CPIA(t1, t2, 3, 3) * if_clock_t1 * if_clock_t2;
 92         }
 93     }
 94     return PolygonArea(a, na) + PolygonArea(b, nb) - res;
 95 }
 96 
 97 Point p1[maxn], p2[maxn];
 98 int n1, n2;
 99 
100 int main() {
101     int i;
102     while(scanf("%d%d", &n1, &n2) != EOF) {
103         for(i = 0; i < n1; ++ i) scanf("%lf%lf", &p1[i].x, &p1[i].y);
104         for(i = 0; i < n2; ++ i) scanf("%lf%lf", &p2[i].x, &p2[i].y);
105         printf("%.2f\n", SPIA(p1, p2, n1, n2) + eps);
106     }
107     return 0;
108 }

 

转载于:https://www.cnblogs.com/ITUPC/p/5891030.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS数据结构与算法——选择排序(把小的数字依次往前放)

一、图解排序过程 注意&#xff1a;选择排序一样是需要进行两两的比较&#xff0c;但比较过程中不进行交换&#xff0c;只有比较完成后&#xff0c;找到最小的那个数&#xff0c;才会进行交换&#xff0c;把它放到最前面。 二、代码实现 三、完整代码 <!DOCTYPE html> &…

插入模板_WordPress在文章列表和内容页插入广告

本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发、Nodejs、Python、Linux、IT资讯等板块.一、在文章列表插入广告文章列表模板 包括以下几个类型以及对应的主体文件:首页模板 (index.php)搜索结果页 (search.php)文章归档 (arch…

Leetcode389

Find the Difference Given two strings s and t which consist of only lowercase letters. 给出两个字符串&#xff0c;s和t&#xff0c;都是只有小写字母组成的。 String t is generated by random shuffling string s and then add one more letter at a random position. …

JS数据结构与算法——插入排序

一、图解排序过程 二、代码实现 三、完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 创建列表类function ArrayList() {//…

cad完全卸载教程_CAD室内设计中厨房布置实例

▲ 点击“CAD教学”&#xff0c;获取海量学习资料和免费教程本文介绍CAD室内设计中厨房布置方法&#xff1a;1、如下图是把另一边墙砌好&#xff0c;因为不砌的话门太大的话不好。在煮菜的烟容易在烟到不胜客厅里。2、在用矩形画宽为40长为800的玻璃门。3、在把厨房的台画出来&…

asp.net 的页面几种传值方式

http://www.cnblogs.com/makqiq/p/5882448.html 1.Querystring Querystring也叫查询字符串&#xff0c;这种页面间传递数据是利用网页地址URL。如果要从A页面跳转到B页面&#xff0c;则可以用Request.Redirect&#xff08;”B.aspx?name参数值”&#xff09;&#xff1b;在页面…

CSS布局(圣杯布局、双飞翼布局、水平垂直居中)

一、圣杯布局 要求&#xff1a;三列布局&#xff1b;中间主体内容前置&#xff0c;且宽度自适应&#xff1b;两边内容定宽 好处&#xff1a;重要的内容放在文档流前面可以优先渲染 原理&#xff1a;利用相对定位、浮动、负边距布局&#xff0c;而不添加额外标签 <!DOCTYPE …

cad怎么设置线的粗细_CAD软件中怎么设置CAD线宽?

在使用CAD软件绘制CAD图纸的过程中&#xff0c;不同线宽的用处是不同的。在机械制图中&#xff0c;零部件的外轮廓就是用粗实线&#xff0c;图形内部的剖开线使用细实线。一般情况下&#xff0c;都是在绘制图形过程中先设置好图形的线宽对象&#xff0c;但也有些需要在后面的绘…

gis连接表格到数据库失败_arcgis连接到数据库失败,常规功能故障

点击查看arcgis连接到数据库失败&#xff0c;常规功能故障具体信息答&#xff1a;解决方法&#xff1a; 1.新建空白地图文档&#xff0c;给整个数据框定义上目标图层相同的地理坐标系。不要设置投影坐标系。由于导入的多为经纬度数据&#xff0c;给数据框设置单位为度(或者度分…

操作数据表中的记录

insert&#xff1a;插入记录 INSERT [INTO] table_name [(column_name,...)] {VALUES/VALUE} ({expr/DEFAULT},...),(...),...;/** insert表名set &#xff08;字段‘’&#xff0c;字段‘’&#xff09; root127.0.0.1 t2>CREATE TABLE user(-> id SMALLINT UNSIGNED PR…

edger和deseq2_转录组分析(二)Hisat2+DESeq2/EdgeR

一、序列比对在2016年的一篇综述A survey of best practices for RNA-seq data analysis&#xff0c;提到目前有三种RNA数据分析的策略。那个时候的工具也主要用的是TopHat,STAR和Bowtie.其中TopHat目前已经被它的作者推荐改用HISAT进行替代。1. Hisat2教程1.1 下载安装#conda直…

HDU 2444 The Accomodation of Students 二分图匹配

HDU 2444 The Accomodation of Students 二分图匹配 题目来源&#xff1a; HDU题意&#xff1a; 给出学生数n和关系数m&#xff0c;接下来给出m个关系。 要求将学生分成两部分&#xff0c;每一部分不能有互相认识的人。做不到就输出"No"。 若上一步满足&#xff0c;则…

检测范围_论文检测系统的检测范围有哪些

为了能够让研究人员&#xff0c;甚至一些专业的学术专家在进行论文创作的时候&#xff0c;端正自己的学术态度&#xff0c;很多人都会要求他们在提交甚至是发表论文之前&#xff0c;附上自己的查重证明&#xff0c;只有查重率低于一定程度时&#xff0c;提交的论文才是合格的。…

[POJ3252]Round Number(数位dp)

题目链接&#xff1a;http://poj.org/problem?id3252 题意&#xff1a;求范围内数字二进制下0的个数大于等于1的个数的数的个数。 数位dp&#xff0c;dp(l,zero,one,fz)记录当前第l位时0的个数1的个数和当前位是否是前导零中的部分&#xff0c;dfs转移就行。 1 #include <b…

2学习率调整_学习率衰减

之前我们的优化&#xff0c;主要是聚焦于对梯度下降运动方向的调整&#xff0c;而在参数迭代更新的过程中&#xff0c;除了梯度&#xff0c;还有一个重要的参数是学习率α&#xff0c;对于学习率的调整也是优化的一个重要方面。01—学习率衰减首先我们以一个例子&#xff0c;来…

Codeforces Round #299 (Div. 2) D. Tavas and Malekas kmp

题目链接&#xff1a; http://codeforces.com/problemset/problem/535/DD. Tavas and Malekastime limit per test2 secondsmemory limit per test256 megabytes问题描述 Tavas is a strange creature. Usually "zzz" comes out of peoples mouth while sleeping, bu…

可怕的乖孩子_当今的中国,有句很可怕的话:所有的乖孩子注定不幸福!

来自soogif▼/01不知道从什么时候起&#xff0c;乖孩子被贴上了一个不幸福的标签&#xff0c; 一个表现很乖的孩子总是会被认为是因为缺乏爱和安全感&#xff0c;才表现的很乖&#xff0c;很懂事的样子的。事实真的是这样子的吗&#xff1f;No&#xff01;爸爸去哪儿5里的Jaspe…

js获取当前日期星期几

var str "今天是星期" "日一二三四五六".charAt(new Date().getDay());alert(str); 转载于:https://www.cnblogs.com/lccnblog/p/5902525.html

适用于VS C++环境的注释代码段,可以让你的代码被使用时有高可读性的注释

编码时&#xff0c;在对高级语言&#xff08;C#/VB etc&#xff09;函数的访问时&#xff0c;经常会有很明确的函数功能提示&#xff0c;参数提示&#xff0c;与返回值提示。微软的VisualStudio C集成开发环境同样有这样的功能&#xff0c;只是常见开源的代码很少按照VS的注释格…

mysql 用户管理表_Mysql—用户表详解(mysql.user)

MySQL数据库Mysql—用户表详解(mysql.user)MySQL是一个多用户管理的数据库&#xff0c;可以为不同用户分配不同的权限&#xff0c;分为root用户和普通用户&#xff0c;root用户为超级管理员&#xff0c;拥有所有权限&#xff0c;而普通用户拥有指定的权限。MySQL是通过权限表来…