Convex Hull:O(h*n)算法 Jarvis March
课程:计算几何
书籍:计算几何:算法与应用
Jarvis March算法也是一种递增式的思路。以极边的一个端点为起点,来查找另一条极边。以此进行下去,最后构成一个环路时(极点的末端等于最初的起始端点)。凸包构造结束。
关于以一个极边为起始点的一天极边。可以用ToLeft测试进行比较,就如同O(n^2)中对点集逆时针排序那样。
关于如何确定起始点,我们选取字典序最小的点作为起始点(Y值最小的点,如果存在多个Y最小值一样的点,再选取X最小的点),起始方向,我们可随意设定。
代码:
Point.h 没有变化
Main.cpp
/* indere 2018/6/23
* O(hn)构造凸包算法思路为:Jarvis March
* 输入:顶点数以及顶点坐标
* 输出:极点编号(看情况是否按Counter-Clockwise输出)
//*
10
7 9
-8 -1
-3 -1
1 4
-3 9
6 -4
7 5
6 6
-6 10
0 8
*/#include "Point.h"Point *points;
int pointsize;void Initialize(); //初始化points数组
void ConstructConvexHull(Point* points); //根据Point数组信息 构造凸包
int LTL(Point* points); //得到顶点数组中字典序最小的索引
int ToLeft(Point v1, Point v2, Point s); //int main() {Initialize();ConstructConvexHull(points);for (int i = 0; i < pointsize; i++) {if (points[i].isExtremePoint)cout << points[i];}return 0;
}void Initialize() {cin >> pointsize;points = new Point[pointsize];for (int i = 0; i < pointsize; i++) {float x, y;cin >> x >> y;points[i] = Point(i + 1, x, y);}
}void ConstructConvexHull(Point* points) {for (int i = 0; i < pointsize; i++) {points[i].isExtremePoint = false;}int ltl = LTL(points); int begin, end;begin = ltl;do {points[begin].isExtremePoint = true;end = -1;for (int i = 0; i < pointsize; i++) {if (i != begin && i != end && (end == -1 || ToLeft(points[begin], points[end], points[i]) == -1))end = i;}begin = end; } while (begin != ltl);
}int LTL(Point* points) {int k = 0;for (int i = 1; i < pointsize; i++) {if (points[k].y > points[i].y || (points[k].y == points[i].y && points[k].x > points[i].x)) {k = i;}}return k;
}int ToLeft(Point v1, Point v2, Point s) {float result = (v2.x *s.y + v1.x * v2.y + v1.y * s.x)- (v1.y * v2.x + v1.x * s.y + v2.y * s.x);if (result > 0.0f) //左侧return 1;if (result == 0.0f) //共线return 2;if (result < 0.0f) //右侧return -1;
}
Convex Hull:O(h*n)算法 Jarvis March相关推荐
- 计算几何入门 1.4:凸包的构造——Jarvis March算法
回顾凸包构造算法:极点法.极边法和增量构造法,其复杂度分别为O(n^4).O(n^3)和O(n^2),效率经过优化已经大大提高了.接下来引入一种新的算法--Jarvis March,其复杂度也是O(n ...
- Monotone Chain Convex Hull(单调链凸包)
1 Monotone Chain Convex Hull(单调链凸包)算法伪代码: 2 //输入:一个在平面上的点集P 3 //点集 P 按 先x后y 的递增排序 4 //m 表示共a[i=0...m ...
- matlab 凸包质心算法,求多边形凸包(线性算法)--陈氏凸包算法--Computing the convex hull of a simple polygon(源码)...
陈氏凸包算法-算法参考:Computing the convex hull of a simple polygon 作者:Chern-Lin Chen 陈氏算法提供了一个线性效率求凸包的算法,本文使用 ...
- 算法自学笔记:Convex Hull问题
convex hull是一个计算机几何问题.对于平面上N个坐标不同的点,如何选取并连接其中部分点构成一个多边形使得该平面所有点都被包括在这一多边形内.如图: 对于输入的任意一组点,输出构成convex ...
- JavaScript:实现Convex hull凸包问题算法(附完整源码)
JavaScript:实现Convex hull凸包问题算法 function compare (a, b) {// Compare Function to Sort the points, a an ...
- 凸包算法详解(convex hull)
一.概念: 凸包(Convex Hull)是一个计算几何(图形学)中的概念. 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包. X的凸包可以用X内所有点(X1,...X ...
- 清华计算几何大作业(一):CG2017 PA1-1 Convex Hull (凸包)
CG2017 PA1-1 Convex Hull (凸包) 1. 前置知识 2. 思路分析 3. 伪代码 4. 可视化结果示例 5. 项目代码(待更新完整) 1.1.1 Numerical Tests ...
- 寻找凸包 (Convex Hull)
凸包问题是算法中经典的题目了,最近算法课讲分治问题时提到了Convex Hull,算法导论的书上也花了篇幅讨论了Convex Hull的求解,主要是Graham方法. 为了能更好地理解分治和Graha ...
- P6810 「MCOI-02」Convex Hull 凸包
P6810 「MCOI-02」Convex Hull 凸包 思路 ∑i=1n∑j=1mτ(i)τ(j)τ(gcd(i,j))∑d=1nτ(d)∑i=1nd∑j=1mdτ(id)τ(id)[gcd(i, ...
最新文章
- RESTful API介绍
- js数组中的引用类型
- 详解JMeter函数和变量
- 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...
- tableau三轴合并_举个栗子!Tableau技巧(34):同一张图表如何呈现多个度量
- scala元组 数组_Scala中的数组
- MAX187_量程0-2.5伏电压表_软件滤波
- LVGL(2)Visual Studio模拟器使用
- matlab定义和调用函数m,Matlab学习-自定义函数与调用
- 【linux】ubuntu更改mysql数据文件路径
- Git用命令提交代码并合并
- 极速office(excel)如何根据身份证号提取性别
- 数商云制药医药供应链erp管理系统解决方案
- ISIS路由过载概述
- 装完linux无法进入windows,安装Ubuntu后无法启动Windows,如何解决?
- 计算机辅助药物设计 开发新药,前沿新知 | 计算机辅助药物设计应用现状
- Office从2019版本降至2016版本
- SpringBoot 存储图片 tomcat服务器存图片 数据库图片路径
- 计算机网恢,电脑附身
- 2021练习题Python的