从多个点集合中计算凸包

时间:2016-12-15 15:20:39

标签: python pandas geometry convex-hull

我有一组多边形(如果您喜欢图论,请考虑周期),我想找到整个要素集的凸包,而不是每个单独的要素/多边形。我正在考虑使用单调链接,这给了我O(n log n)时间来获得一组点,但由于我可以有0到n个点集合,有没有更好的方法来实现快速处理时间?

由于

2 个答案:

答案 0 :(得分:1)

如果您的多边形是凸的,请考虑使用rotating calipers

他们的一个应用是为两个凸多边形构建公共凸包(对于越来越多的多边形重复凸包合并)(chapter 5chapter 2.6

答案 1 :(得分:0)

有两种方法可以实现您想要做的事情:

第一种方式 使用“在线”凸包算法。 “在线”表示(动态添加),可让您逐个添加点。我已经在每个点的O(log h)中完成了一个算法,可以在GitHub中访问。它实际上是最快的aglorithm。它基于Ouellet Convex hull。该项目是OuelletConvexHullAvl2Online。在你的情况下,你循环遍历每个多边形,并为每个多边形循环,为你的每个点提供在线算法。

样本用法:

OuelletConvexHullAvl2Online.ConvexHullOnline convexHullOnline = new OuelletConvexHullAvl2Online.ConvexHullOnline();
                foreach (Point pt in points)
                {
                    convexHullOnline.DynamicallyAddAnotherPointToConvexHullIfAppropriate(pt);
                }

                return convexHullOnline.GetResultsAsArrayOfPoint();

第二种方式 使用“复合”设计模式来包装多边形,因为它将是点矢量的单个实例(IEnumerable或点)。然后,您使用复合对象提供任何常规算法。复合将完成为所有多边形的每个节点提供的艰苦工作,就好像它们是一个单独的对象(一种点数组)。顺便说一句,我在我的算法中使用复合OuelletConvexHullAvl2Online:ConvexHullEnumerator,它将枚举4象限(AVL树)中包含的结果凸包点。