This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.

 

在线笛卡尔坐标系绘图网站

核心思想

  1.积角排序

  2.双端队列维护半平面交

木有啦~~

  1. int HPI(L*l,int n,D*ans){
  2. int head,tail,m=;D*P=new D[n];L*q=new L[n];
  3. sort(l+,l+n+),q[head=tail=]=l[];
  4. for(int i=;i<=n;i++){
  5. while(head<tail && !Left(l[i],P[tail-]))tail--;
  6. while(head<tail && !Left(l[i],P[head])) head++;
  7. q[++tail]=l[i];//双端队列<( ̄3 ̄)>
  8. if(fabs(Cross(q[tail].v,q[tail-].v))<eps){
  9. tail--;//判断Cross(q[tail].v,q[tail-1].v)==0♪(^∇^*)
  10. if(Left(q[tail],l[i].P))q[tail]=l[i];
  11. }
  12. if(head<tail)P[tail-]=Intersect(q[tail-],q[tail]);
  13. }
  14. while(head<tail && !Left(q[head],P[tail-]))tail--;
  15. if(tail-head<=)return ;
  16. P[tail]=Intersect(q[tail],q[head]);
  17. for(int i=head;i<=tail;i++)ans[++m]=P[i];
  18. return m;
  19. }

多边形相关

  1. db Area(D*R,int n){
  2. db S=0.0;
  3. for(int i=;i<n;i++)S+=Cross(R[i]-R[],R[i+]-R[]);
  4. return S/;
  5. }
  6.  
  7. db Length(D*R,int n){
  8. db C=0.0;
  9. for(int i=;i<=n;i++)C+=Dis(R[i],R[i-]);
  10. return C+Dis(R[n],R[]);
  11. }

主程序

  1. L l[];D A[];
  2. int main(){
  3. for(int n;scanf("%d",&n)&&n;){
  4. for(int i=;i<=n;i++){
  5. db a,b,c,d;
  6. scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  7. D A(a,b),B(c,d);
  8. l[i]=L(A,B-A);
  9. }
  10. int m=HPI(l,n,A);
  11. cout<<"m="<<m<<endl;
  12. for(int i=;i<=m;i++)printf("(%.4lf,%.4lf)\n",A[i].x,A[i].y);
  13. printf("S=%.2lf\n",Area(A,m));
  14. printf("C=%.2lf\n",Length(A,m));
  15. }
  16. return ;
  17. }

读入,如图(橙、红、蓝、绿)

  1. 4
  2. 2 1 1 2
  3. 1 2 0 1
  4. 1 0 2 1
  5. 0 1 1 0

输出

  1. m=4
  2. (0.0000,1.0000)
  3. (1.0000,0.0000)
  4. (2.0000,1.0000)
  5. (1.0000,2.0000)
  6. S=2.00
  7. C=5.66

读入

  1. 6
  2. 1 2 0 1
  3. 0 1.8 0.8 0.2
  4. 0 1 1 0
  5. 1 0 2 1
  6. 3 0 1 2
  7. 0.6 1.6 0 0.7

输出

  1. m=6
  2. (0.6000,1.6000)
  3. (0.3143,1.1714)
  4. (0.8000,0.2000)
  5. (1.0000,0.0000)
  6. (2.0000,1.0000)
  7. (1.0000,2.0000)
  8. S=1.76
  9. C=5.28

完整代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <vector>
  7. #include <cmath>
  8. #include <queue>
  9. #include <map>
  10. #include <set>
  11. using namespace std;
  12. #define sqr(x) ((x)*(x))
  13. #define RG register
  14. #define op operator
  15. #define IL inline
  16. typedef double db;
  17. typedef bool bl;
  18. const db pi=acos(-1.0),eps=1e-;
  19. struct D{
  20. db x,y;
  21. D(db x=0.0,db y=0.0):x(x),y(y){}
  22. };
  23. typedef D V;//不知道什么鬼,emacs 将 operator -> op 会萎掉 对!不!齐!
  24. bl operator<(D A,D B){return A.x<B.x||(A.x==B.x&&A.y<B.y);}
  25. V operator+(V A,V B){return V(A.x+B.x,A.y+B.y);}
  26. V operator-(V A,V B){return V(A.x-B.x,A.y-B.y);}
  27. V operator*(V A,db N){return V(A.x*N,A.y*N);}
  28. V operator/(V A,db N){return V(A.x/N,A.y/N);}
  29.  
  30. db Ang(db x){return(x*180.0/pi);}
  31. db Rad(db x){return(x*pi/180.0);}
  32. V Rotate(V A,db a){return V(A.x*cos(a)-A.y*sin(a),A.x*sin(a)+A.y*cos(a));}
  33. db Dis(D A,D B){return sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));}
  34. db Cross(V A,V B){return A.x*B.y-A.y*B.x;}
  35.  
  36. db Area(D*R,int n){
  37. db S=0.0;
  38. for(int i=;i<n;i++)S+=Cross(R[i]-R[],R[i+]-R[]);
  39. return S/;
  40. }
  41.  
  42. db Length(D*R,int n){
  43. db C=0.0;
  44. for(int i=;i<=n;i++)C+=Dis(R[i],R[i-]);
  45. return C+Dis(R[n],R[]);
  46. }
  47.  
  48. struct L{
  49. D P,v;
  50. db a;
  51. L(){}
  52. L(D P,V v):P(P),v(v){a=atan2(v.y,v.x);}
  53. bool operator<(const L x)const{return a<x.a;}
  54. };
  55.  
  56. D Intersect(L a,L b){
  57. V u=a.P-b.P;
  58. return a.P+a.v*(Cross(b.v,u)/Cross(a.v,b.v));
  59. }
  60.  
  61. bool Left(L l,D A){
  62. return Cross(l.v,A-l.P)>;
  63. }
  64.  
  65. int HPI(L*l,int n,D*ans){
  66. int head,tail,m=;D*P=new D[n];L*q=new L[n];
  67. sort(l+,l+n+),q[head=tail=]=l[];
  68. for(int i=;i<=n;i++){
  69. while(head<tail && !Left(l[i],P[tail-]))tail--;
  70. while(head<tail && !Left(l[i],P[head])) head++;
  71. q[++tail]=l[i];//双端队列<( ̄3 ̄)>
  72. if(fabs(Cross(q[tail].v,q[tail-].v))<eps){
  73. tail--;//判断Cross(q[tail].v,q[tail-1].v)==0♪(^∇^*)
  74. if(Left(q[tail],l[i].P))q[tail]=l[i];
  75. }
  76. if(head<tail)P[tail-]=Intersect(q[tail-],q[tail]);
  77. }
  78. while(head<tail && !Left(q[head],P[tail-]))tail--;
  79. if(tail-head<=)return ;
  80. P[tail]=Intersect(q[tail],q[head]);
  81. for(int i=head;i<=tail;i++)ans[++m]=P[i];
  82. return m;
  83. }
  84.  
  85. L l[];
  86. D A[];
  87. int main(){
  88. cout<<*sqrt()<<endl;
  89. for(int n;scanf("%d",&n)&&n;){
  90. for(int i=;i<=n;i++){
  91. db a,b,c,d;
  92. scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  93. D A(a,b),B(c,d);
  94. l[i]=L(A,B-A);
  95. }
  96. int m=HPI(l,n,A);
  97. cout<<"m="<<m<<endl;for(int i=;i<=m;i++)printf("(%.4lf,%.4lf)\n",A[i].x,A[i].y);
  98. printf("S=%.2lf\n",Area(A,m));
  99. printf("C=%.2lf\n",Length(A,m));
  100. }
  101. return ;
  102. }

HPI

计算几何-HPI的更多相关文章

  1. 计算几何-BZOJ2618-凸包的交-HPI

    This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. bzoj2618 ...

  2. ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)

    POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...

  3. HDU 2202 计算几何

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. ACM 计算几何中的精度问题(转)

    http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...

  5. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

    Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a b ...

  7. [知识点]计算几何I——基础知识与多边形面积

    // 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...

  8. POJ 1106 Transmitters(计算几何)

    题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...

  9. TYVJ计算几何

    今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...

随机推荐

  1. Kubernetes Pod故障归类与排查方法

    Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...

  2. 性能优化-css,js的加载与执行

    前端性能优化 css,js的加载与执行 javascript是单线程的 一个网站在浏览器是如何进行渲染的呢? html页面加载渲染的过程 html渲染过程的一些特点 顺序执行,并发加载 词法分析 并发 ...

  3. 文件包含漏洞(DVWA环境中复现)

    LOW: 源代码: <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> 可以看到,low级别的代码对包含的文件 ...

  4. 假期学习【六】Python网络爬虫2020.2.4

    今天通过Python网络爬虫视频复习了一下以前初学的网络爬虫,了解了网络爬虫的相关规范. 案例:京东的Robots协议 https://www.jd.com/robots.txt 说明可以爬虫的范围 ...

  5. 熵权法(the Entropy Weight Method)以及MATLAB实现

    按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量:如果指标的信息熵越小,该指标提供的信息量越小,在综合评价中所起作用理当越小,权重就应该越低.因此,可利用信息熵这个工 ...

  6. windows-problem :电脑上网的无线图标带有黄色星号,但不影响正常上网!

    电脑可以上网,但是无线图标带有黄色星号如何解决? 进入“网络和共享中心”,点击“更改适配器设置”,看看是不是有两个以上的“本地连接”,只有一个有用,其他的删除即可.

  7. springboot 扫描不到包 @SpringBootApplication 自动配置原理

    解决方案 在main类中增加注解 @ComponentScan("com.test.test.*") 扫描具体的包 @ComponentScan(basePackages = {& ...

  8. Java代码手段防止非法请求——防盗链

    Java代码手段防止非法请求,思路如下:        1. 获取到当前请求的域名,如www.a.com        2. 获取到请求资源的上一个地址        3. 判断上一个地址是否为空,如 ...

  9. LEF 格式

    LEF 文件是布局布线根据使用的cell 几何信息库的文件格式,下面是一个LEF文件的部分,右边是对他的解释.布局布线工具将根据LEF文件的信息决定怎样布局,怎么走线,怎样生成通孔. VERSION ...

  10. 最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)

    当然,这篇文章是借鉴大佬的... 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下... 1.Dijkstra(权值非负,适用 ...