凸包

算法三十二:凸包

匿名 (未验证) 提交于 2019-12-03 00:39:02
描述 给定n个二维平面上的点,求他们的凸包。 输入 第一行包含一个正整数n。 接下来n行,每行包含两个整数x,y,表示一个点的坐标。 输出 令所有在凸包极边上的点依次为p1,p2,...,pm(序号),其中m表示点的个数,请输出以下整数: (p1 × p2 × ... × pm × m) mod (n + 1) 样例输入 10 7 9 -8 -1 -3 -1 1 4 -3 9 6 -4 7 5 6 6 -6 10 0 8 样例输出 7 样例解释 所以答案为(9 × 2 × 6 × 7 × 1 × 5) % (10 + 1) = 7 一. 伪代码 二. 具体实现 #include <bits/stdc++.h> using namespace std; // ================= 代码实现开始 ================= typedef long long ll; const int N = 300005; // 存储二维平面点 struct ip { }; // iv表示一个向量类型,其存储方式和ip一样 typedef ip iv; // 先比较x轴再比较y轴, bool operator < (const ip &a, const ip &b) { } // 两点相减得到的向量 iv operator - (const ip &a, const ip &b

计算二维空间中点的集合的最小凸包

匿名 (未验证) 提交于 2019-12-03 00:22:01
from scipy import spatial import numpy as np import matplotlib.pyplot as plt np.random.seed(42) points2d=np.random.rand(10,2)#一组二维平面上的随机点 #convexHull计算包含N维空间中点的集合的最小凸包 ch2d=spatial.ConvexHull(points2d) #绘图 poly=plt.Polygon(points2d[ch2d.vertices],fill=None,lw=2,color='r',alpha=0.5) ax=plt.subplot(aspect='equal') plt.plot(points2d[:,0],points2d[:,1],'go') for i ,pos in enumerate(points2d): plt.text(pos[0],pos[1],str(i),color='blue') ax.add_artist(poly) plt.show() ConvexHull.simplices是凸包每条边线的两个顶点在二维平面上的下标 ConvexHull.vertices是凸多边形的每个顶点在二维平面上的下标 文章来源: 计算二维空间中点的集合的最小凸包

OpenCV学习笔记-凸包和凸缺陷

匿名 (未验证) 提交于 2019-12-03 00:22:01
一、凸包 凸包和轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。函数cv.convexHull()可以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。一般来说,凸性曲线总是凸出来的,至少是平的。如果有地方凹进去了就被叫做凸性缺陷。 convexHull(points, hull= None , clockwise= None , returnPoints= None ) clockwise:方向标志。如果设置为Ture,输出的凸包方向是顺时针方向的。否则为逆时针方向。 returnPoints:默认为Ture。它会返回凸包上点的坐标。如果设置为False,就会返回与凸包点对应的轮廓上的点 二、凸缺陷 对象上的任何凹陷都被称为凸缺陷,cv.convexityDefect()函数可以帮助我们找到凸缺陷。 它会返回一个数组,其中每一行包含的值是[起点,终点,最远的点,到最远点的近似距离]。 要记住的是返回结果的前三个值是轮廓点的索引,我们还要到轮廓点中找它们。 注意:如果要查找凸缺陷,在使用函数cv.convexHull()找凸包时,参数returnPoints一定要是False 我们将起点和终点用一条绿线连接,在最远点画一个圆圈。 具体代码: 三、Point Polygon Test cv.pointPolygonTest()求解图像中的一个点到一个对象轮廓的最短距离

编码效率优化――Per-Title Encoding,Dynamic Optimizer及其它

匿名 (未验证) 提交于 2019-12-03 00:19:01
以往我们说起来编码效率优化,都是想得如何去优化编码器里面的算法,但是netflix的一些做法给了我们新的启示,也许不用费劲去研究编码算法,只是改变一下编码器的用法,一样能获得更高的编码效率,节省更多的带宽。 一、Per-Tiitle Encoding 2015年的时候,netflix推出了per titile encoding方案,简单来说就是依据每个视频的特性,比如时间复杂度和空间复杂度,来决定服务端编码的码率级别,不同于以往给所有视频统一码率级别的编码方式,这种方法可以更好的平衡质量和带宽。 很显然,对于小猪佩奇这样的动画片,画面简单,没有复杂的运动,我们可以用很少的码率达到很高的质量,但是对于复仇者联盟这样的电影,打斗场面丰富,就需要相应的稍高的码率了。 netflix没有专门去研究时间复杂度,空间复杂度,码率与主观质量之间的关系,而是采用了一种更加简单粗暴的方法,如下图。将一个片源按照不同分辨率码率组合进行编码,计算psnr值,画出r-d曲线图 图中红色曲线是r-d曲线的凸包,对于每个分辨率的曲线,最接近凸包的点即为编码效率最好的点,这些点就选为最终的分辨率-码率参数。 效果如何呢?参考下图 这是对一个普通电影的优化效果,这部电影的复杂度适中,中间的黄色栏是采用固定码率级别时的情况,右边表格的绿色部分分别展示了使用per title

斜率优化总结

匿名 (未验证) 提交于 2019-12-02 23:52:01
考虑如下$dp$: $dp(i)=max/min(A(i)+B(j)+C(i)D(j))$ $(j < i)$ 其中,A(i),C(i)只与i有关,B(j),D(j)只与j有关。 括号里有与i,j同时有关的项,导致单调队列优化失效,但是如果这样的项只有一个可以采用斜率优化。方法如下: 将此dp方程转化为$dp(i)-A(i)=max/min(B(j)-C(i)(-D(j)) )$的形式。 设b=dp(i)-A(i),y=B(j),k=C(i),x=-D(j) 即$b=y-kx$,这时,只要使b最小/最大,就能使结果最小/最大。 移项,得$y=kx+b$,转化为直线的形式。每计算完一个j就可以计算出对应的x,y. 其实就是把要最优的值设为b,只和j相关的项设为y,同时相关的设为kx。 还有类似$b=ay-kx$的形式(两项相关),只要转为$b/a=y-(k/a)*x$即可。 以最大为例(最小类似),现在就是要在所有的(x,y)中找出一对使得b最大。 把(x,y)表示为坐标系中点的形式,就是找一个点使得斜率为k的直线经过这个点时与y轴的交点的y坐标尽量大。 可以发现把斜率为k的直线放在无限高处,再向下平移,接触到的第一个点就是结果。 如图: 因为要求最大值,所以只有上凸包上的点有可能成为最大值,其他点可以删除。 这时,红色箭头即为b,绿色箭头即为最优的(x,y)。dp(i)就是b+A

opencv计算点集凸包

匿名 (未验证) 提交于 2019-12-02 23:40:02
点集求凸包的问题经常会遇到, 给出了一种思路,有空了再仔细研究,本文总结了opencv中相关的方法并给出一个实例。 参考: https://docs.opencv.org/4.0.0/d3/dc0/group__imgproc__shape.html#ga014b28e56cb8854c0de4a211cb2be656 1、opencv接口 hull = cv.convexHull(points[, hull[, clockwise[, returnPoints]]]) 参数说明: points:点集。需要注意的是,该参数输入的坐标系是向右为X,向上为Y,和迪卡尔坐标系是相同的,而opencv中的图像坐标系是向下为X,向右为Y,即图像的左上角坐标为(0,0)。 clockwise:如果设置为True,输出的凸包是顺时针的,如果设置为False,输出的凸包是逆时针的。 returnPoints:如果设置为True,返回凸包的点坐标,如果设置为False,输出凸包点在点集points中的序号。 2、示例 代码如下: # encoding:utf-8 import numpy as np import cv2 import matplotlib.pyplot as plt axis_list = [[3,1],[2,2],[3,3],[4,4],[2,4],[2,3],[1,2],[2

在Python中用许多点找到两个最远点的点

匿名 (未验证) 提交于 2019-12-02 22:51:30
正如屏幕截图所示,我有一个包含其他两个数组的数组.一个用于X,一个用于Y坐标.确定数据中最长线的最佳方法是什么?通过这样说,我需要选择情节中最远的两个点.希望你们能帮忙.下面是一些帮助解释问题的截图. 解决方法 您可以通过观察相距最远的两个点将作为凸包中的顶点出现来避免计算成对距离.然后,您可以计算较少点之间的成对距离. 例如,在单位平方中均匀分布100个点,在我的实例中凸包中只有22个点. import numpy as np from scipy import spatial # test points pts = np.random.rand(100,2) # two points which are fruthest apart will occur as vertices of the convex hull candidates = pts[spatial.ConvexHull(pts).vertices] # get distances between each pair of candidate points dist_mat = spatial.distance_matrix(candidates,candidates) # get indices of candidates that are furthest apart i,j = np.unravel

[JSOI2018]战争

≡放荡痞女 提交于 2019-12-02 02:54:44
题目描述 九条可怜是一个热爱读书的女孩子。 在她最近正在读的一本小说中,描述了两个敌对部落之间的故事。第一个部落有 nn n 个人,第二个部落有 mm m 个人,每一个人的位置可以抽象成二维平面上坐标为 (xi,yi)(x_i,y_i) ( x i ​ , y i ​ ) 的点。 在这本书中,人们有很强的领地意识,对于平面上的任何一个点,如果它被三个来自同一部落的人形成的三角形(可能退化成一条线段)包含(包括边界),那么这一个点就属于这一个部落的领地。如果存在一个点同时在两个阵营的领地中,那么这两个部落就会为了争夺这一个点而发生战争。 常年的征战让两个部落不堪重负,因此第二个部落的族长作出了一个英明的决定,他打算选择一个向量 (dx,dy)(dx,dy) ( d x , d y ) ,让所有的族人都迁徙这个向量的距离,即所有第二阵营的人的坐标都变成 (xi+dx,yi+dy)(x_i+dx,y_i+dy) ( x i ​ + d x , y i ​ + d y ) 。 现在他计划了 qq q 个迁徙的备选方案,他想要你来帮忙对每一个迁徙方案,计算一下在完成了迁徙之后,两个部落之间还会不会因为争夺领地而发生战争。 输入格式 第一行输入三个整数 n,m,qn,m,q n , m , q,表示两个部落里的人数以及迁徙的备选方案数。 接下来 nn n 行每行两个整数 xi,yix_i,y

10.15

二次信任 提交于 2019-12-01 12:58:46
A. 导弹袭击 单调栈维护下凸包,凸包还没有学懂,一定有时间把凸包学懂!(立flag) B. 炼金术士的疑惑 利用高斯消元巧妙解决问题。 B. 炼金术士的疑惑 暴力算法:二分t然后$O(nlog n)$统计LIS。 来源: https://www.cnblogs.com/hzoi2018-xuefeng/p/11687322.html

旋转卡壳学习笔记

被刻印的时光 ゝ 提交于 2019-11-30 06:35:59
  旋转卡壳属于计算几何内容,用于求平面最远点对。   首先,易证最远点对一定是凸包上的两个点,对于平面上n个点,先使用graham扫描法求出凸包上所有的点,复杂度$O(nlogn)$。随后,假设最远的点对为点m,n,点m到与n的距离最远,设点n在凸包上的两条边为l1与l2,记m到直线l1,l2距离为dis(m,l1)和dis(m,l2),则点n到边l1或l2的距离一定是凸包上最远的,凸包不存在其他的点到凸包上的某条边距离大于它。即max(dis(m,l1),dis(m,l2))>=dis(p,l),其中p为凸包上的点,l为凸包上的边。这一点看了很多的博客,都写的易证,我上周证了两天愣是没证出来,有能帮忙解答的欢迎留言,万分恳求有大神来帮忙解释。   随后,就是旋转卡壳的精髓,对于边l1,若距离最远的点为p1,当搜索到l1逆时针方向上的点l2时,距离l2最远的点位p1或p1逆时针方向上的点p2,即max(dis(l2,p1),dis(l2,p2))>=dis(l2,p),p为凸包上任意的点。因此,只需要在逆时针枚举边的时候同时将所对应的点也逆时针方向移动即可。   例题poj2187,这道题数据可能是随机的,点虽然多,但是计算出的凸包上的点数量非常少,实际上枚举凸包上任意两点距离即可,但对于4e5数据大小极限复杂度$O(n^{2})$,完全可以构造数据,所有点都是凸包上的点