学习凸包(四):Graham 扫描法

Graham扫描法

基本思想:通过设置一个关于候选点的堆栈来解决凸包问题。

操作:输入集合P中的每一个点都被压入栈一次,非凸包中的顶点的点最终将被弹出堆栈,
当算法终止时,堆栈中仅包含凸包中的顶点,其顺序为个各顶点在边界上出现的逆时针方向排列的顺序。


(1)设P0是P中Y坐标最小的点,如果有多个这样的点则取最左边的点作为P0;

(2) 设<P1,P2,……,Pn >是P中剩余的点,对其按逆时针方向相对P0 的极角进行排序,
如果有数个点有相同的极角,则去掉其余的点,只留下一个与P0 距离最远的那个点;

(3)
//前三个点先入栈
ch[0] = p[0];
ch[1] = p[1];
ch[2] = p[2];

//判断与其余所有点的关系
for (int i = 3; i < n; i++) {
//不满足向左转的关系,栈顶元素出栈
while (top > 0 && multiply(p[i], ch[top], ch[top - 1]) >= 0)
top--;
//当前点与栈内所有点满足向左关系,因此入栈.
ch[++top] = p[i];
}

原理:沿逆时针方向通过凸包时,在每个顶点处应该向左转。因此,while循环每次发现在一个顶点处没有向左转时,就把该顶点从堆栈中弹出。)当算法向点pi推进、在已经弹出所有非左转的顶点后,就把pi压入堆栈中。


下面是POJ1113的AC代码:关于POJ1113请参见 http://128kj.iteye.com/blog/1748635
Java代码 复制代码 收藏代码
  1. import java.util.Scanner;
  2. class Point {
  3. double x;
  4. double y;
  5. public Point(int x, int y) {
  6. this.x = x;
  7. this.y = y;
  8. }
  9. }
  10. public class Main {
  11. Point[] ch; //点集p的凸包
  12. Point[] p ; //给出的点集
  13. int n;
  14. int l;
  15. int len=0;
  16. public Main(Point[] p,int n,int l){
  17. this.p=p;
  18. this.n=n;
  19. this.l=l;
  20. ch= new Point[n];
  21. }
  22. //小于0,说明向量p0p1的极角大于p0p2的极角
  23. public double multiply(Point p1, Point p2, Point p0) {
  24. return ((p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y));
  25. }
  26. //求距离
  27. public double distance(Point p1, Point p2) {
  28. return (Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y)
  29. * (p1.y - p2.y)));
  30. }    
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值