博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算几何 --- 凸包 模板
阅读量:6090 次
发布时间:2019-06-20

本文共 1517 字,大约阅读时间需要 5 分钟。

//Memory   Time// 1347K   0MS// by : Snarl_jsb#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1100#define N 1000#define INF 1000000#define LL long longusing namespace std;struct point{ int x,y; //横纵坐标 : x,y double len,theta; //与参考点的距离 len 与参考点构成的向量与 (1,0)向量构成的夹角的余弦值 theta}g[N]; //定义了一个全局变量,记录凸包中的点/*--------按余弦值,从大到小快速排序--------*/void qsort(int st,int en){ int i=st,j=en; g[0]=g[i]; while(i
=g[j].theta) j--; if(i
g[k].len) k=p+1; p++; } map[++tot]=g[k]; p++; } /*第四步,对map中的元素扫描一遍,确定凸包的元素,放在数组g中*/ *n=tot; tot=3; //先做了一个小小的处理,使得自己更好理解 memset(g,0,sizeof(g)); g[1]=map[1]; g[2]=map[2]; g[3]=map[3]; //先将前三个点入栈 g for(int i=4;i<=*n;i++) //依次用map中的每个点对g中的点进行一次判断,看是否是属于凸包 { double chaji=(g[tot].x-g[tot-1].x)*(map[i].y-g[tot].y)-(map[i].x-g[tot].x)*(g[tot].y-g[tot-1].y); for(;chaji<=0 && tot>=1;) //如果旋转的方向不同,g[tot]这个点就不是,删除,并继续判断 g 中下一个点是不是 { tot--; chaji=(g[tot].x-g[tot-1].x)*(map[i].y-g[tot].y)-(map[i].x-g[tot].x)*(g[tot].y-g[tot-1].y); } g[++tot]=map[i]; //将map[i]这个点入栈,至于是否是属于凸包中的点,等待以后的点来判断 } *n=tot;//凸包处理完,总共有tot个凸包上的点}int main(){ //freopen("C:/Users/chengfeng/Desktop/in.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d%d",&g[i].x,&g[i].y); graham(&n); for(int i=1;i<=n;i++) printf("(%d,%2d)\n",g[i].x,g[i].y); } return 0;}

  

转载于:https://www.cnblogs.com/crazyacking/p/3915511.html

你可能感兴趣的文章
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>