Monotone Chain Convex Hull(单调链凸包)

 1 Monotone Chain Convex Hull(单调链凸包)算法伪代码:
 2 //输入:一个在平面上的点集P
 3 //点集 P 按 先x后y 的递增排序
 4 //m 表示共a[i=0...m]个点,ans为要求的点;
 5 struct P
 6 {
 7     int x,y;
 8     friend int operator < (P a, P b)
 9 {
10     if((a.x<b.x) || (a.x==b.x && a.y<b.y))
11         return 1;
12     return 0;
13 }
14 }a[m+10],ans[m+10];
15 //判断第三点在这个直线的左侧还是右侧
16 //当judge(), 的返回值小于等于0,说明在右侧,我们一直要找在直线右侧的点
17 double judge(P a, P b,P c)
18 {
19   return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
20 }
21 //构建下凸包,从左跑到右,由下面通过
22    int k1=0;
23    for(int i=0; i<m; i++)//下凸包
24    {
25        while(k1>1 && judge(ans[k1-2],ans[k1-1],a[i])<=0)
26        {
27             k1--;
28        }
29      ans[k1++]=a[i];
30    }
31 // 构建上凸包,从右到左,由上面通过
32  int k2=k1;
33     for(int i=m-1; i>=0; i--)//上凸包
34    {
35        while(k1>k2 && judge(ans[k1-2],ans[k1-1],a[i])<=0)
36        {
37             k1--;
38        }
39      ans[k1++]=a[i];
40    }
41    k1--;//减去起点,因为起点进去了两次;

凸包题目:nyoj 78

时间: 2024-10-10 02:09:23

Monotone Chain Convex Hull(单调链凸包)的相关文章

Hdu 3662 3D Convex Hull(三维凸包)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3662 思路:三维凸包模板. #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define PR 1e-8 #define N 510 using namespace std; struct TPoint { doub

Gym 101986D Making Perimeter of the Convex Hull Shortest(凸包+极角排序)

首先肯定是构造一个完整的凸包包括所有的点,那么要使得刚好有两个点在外面,满足这个条件的只有三种情况. 1.两个在凸包上但是不连续的两个点. 2.两个在凸包上但是连续的两个点. 3.一个在凸包上,还有一个在这个点去掉后这段新凸包边上的一个点. 如何快速的截取新凸包的点是谁呢,我们可以将整个凸包划分区域,每个点删掉后,只可能在这块区域内选择新的点.那么我们就可以随机在凸包内部选择一个点,我使用的是凸包的重心作为坐标原点o,那么整个凸包移到原点处,然后在这个点的左侧和右侧的三角形区域内才是有可能构成新

凸包(Convex Hull)构造算法——Graham扫描法

凸包(Convex Hull) 在图形学中,凸包是一个非常重要的概念.简明的说,在平面中给出N个点,找出一个由其中某些点作为顶点组成的凸多边形,恰好能围住所有的N个点. 这十分像是在一块木板上钉了N个钉子,然后用一根绷紧的橡皮筋它们都圈起来,这根橡皮筋的形状就是所谓的凸包. 计算凸包的一个著名算法是Graham Scan法,它的时间复杂度与所采用的排序算法时间复杂度相同,通常采用线性对数算法,因此为\( O\left(N\mathrm{log}\left(N\right)\right) \).

zoj 3871 Convex Hull(凸包)

题目链接:zoj 3871 Convex Hull 枚举每条边,计算出有多少情况下为凸包的边界,即有多少点在该边的左边. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <complex> #include <algorithm> using namespace std; typedef pair<int,int&g

opencv笔记(二十四)——得到轮廓之后找到凸包convex hull

当我们得到一张轮廓之后,我们可以对其运用convexHull方法,寻找该轮廓的凸包. 一个轮廓可以有无数个包围它的外壳,而其中表面积最小的一个外壳,就是凸包. void convexHull(InputArray points, OutputArray hull, bool clockwise=false, bool returnPoints=true ) points是一个contour. vector<Point>类型或者Mat类型 hull是输出,也是一个点集vector<Poin

Computational Geometry PA1 Convex Hull (凸包)

题目链接:http://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=710 CG2015 PA1-1 Convex Hull (凸包) Description (描述) After learning Chapter 1, you must have mastered the convex hull very well. Yes, convex hull is at the kernel of computational geometry and serv

[算法课][分治]寻找凸包 (Convex Hull)

凸包问题是算法中经典的题目了,最近算法课讲分治问题时提到了Convex Hull,算法导论的书上也花了篇幅讨论了Convex Hull的求解,主要是Graham方法. 为了能更好地理解分治和Graham这两种解法,我决定自己动手把代码写一遍. 然而,在写之前,我发现我大一学的用行列式求解由三个点围城的三角形面积已经忘得差不多了,现在补充一下: 利用这个计算结果来判断点p3在p1p2直线的左侧还是右侧 下面是分治算法求解: #include <iostream> #include <alg

OpenCV入门之寻找图像的凸包(convex hull)

介绍   凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包.  在图像处理过程中,我们常常需要寻找图像中包围某个物体的凸包.凸包跟多边形逼近很像,只不过它是包围物体最外层的一个凸集,这个凸集是所有能包围这个物体的凸集的交集.如下图所示: 在上图中,绿色线条所包围的凸集即为白色图形的凸包.  在opencv中,通过函数convexHulll能很容易的得到一系列点的凸包,比如由点组成的轮廓

凸包问题Finding the convex hull

问题描述:找到包含点集Q的最小凸多边形.使得点集内的点均在凸多边形的边上或内部. 即集合内任意两点的连线均在凸多边形内部. 输入:平面上的n个点的集合Q 输出: CH(Q):Q的convexhull (一)蛮力法思路: 找到点集内的内部点去掉,剩余未边界点. 内部点的判断:只要其中三点A,B,C构成的三角形包含的点P则P为内部点. 三角形内部点具体判断方法: 如果P在△ABC内部,则A,P两个点在BC同侧:P,B两个点在AC同侧:C,P两个点在AB同侧.转换为点与线关系的判断. 判断点P与直线A