根据点云圆将区域划分为子区域

问题描述

我有一个矩形R,其边长为lx(水平)和lz(垂直),面积为A = lx * lz。在这个矩形中,有N个随机分布的点。我想将A划分为N个子区域,其中每个子区域都是基于围绕点云每个点的半径不断增大的圆确定的。一旦两个生长圆相交,则产生的基本线应标出两点子区域之间的局部边界。矩形R的边界应另外划定子区域。

此图概述了预期的结果: Expected sub-areas in an example with 6 points

这段简短的Youtube电影在艺术上说明了大致的过程: https://www.youtube.com/watch?v=BXNvcQTNWXM&ab_channel=stopmotionkim

要找到子区域,我正在寻找一种近似或精确的算法(第一优先级)是有效的,并且可以很好地缩放N(比O [N ^ 2]好,最好是O [N]),尽管我对此表示怀疑(这是可能的),并且(第二优先级)(如果近似)则尽可能准确。

有人知道如何做到这一点,或者暗示如何开始?非常感谢您的帮助!

解决方法

您正在寻找的是裁剪的Voronoi图。可以用O(nlogn)计算。我建议您看一下这些论文/课程,以更好地了解基础理论和计算方法:

Efficient Computation of 3D Clipped Voronoi Diagram
Computational Geometry

有关Python实现,请参见this post