我在特定的多边形边界内有一组线要素。对于每条线,我想生成一个多边形,在该多边形内,每个可能的点比该层中的任何其他线更靠近给定的线。过去,我已经使用Delaunay三角剖分对点输入要素进行了此操作,但是如果使用线要素进行相似的处理,我将找不到它。

ETA:Geogeek的解决方案发生在我身上,但在较直的部分中,输入线的顶点较少,因此产生的多边形太靠近(甚至重叠)了一条本不应该的线。在这里,红线是我的输入,您可以看到顶点和由此产生的Thiessen多边形。



也许一个快速且(非常)肮脏的解决方案可能是将每条线转换为一组均匀分布的点(而不是仅线的顶点),从中生成蒂森多边形,然后根据原始线ID对其进行溶解。

评论

包含线段和点的Voronoi图不是由“多边形”组成;相反,它们的单元格具有可以包括抛物线部分的边界。因此,创建Voronoi镶嵌的最有效,最准确的方法之一就是使用栅格表示。 ESRI将此过程称为欧几里得分配。

#1 楼

为了说明光栅/图像处理解决方案,我从发布的图像开始。由于蓝点,灰线,彩色区域和文本的叠加,它的质量比原始数据低得多;以及原始红线的加粗。因此它提出了一个挑战:尽管如此,我们仍然可以高精度获得Voronoi细胞。

我通过从红色通道中减去绿色,然后进行扩张和腐蚀来提取红色线性特征的可见部分。最亮的部分三个像素。这用作欧几里德距离计算的基础:

i = Import["http://i.stack.imgur.com/y8xlS.png"];
{r, g, b} = ColorSeparate[i];
string = With[{n = 3}, Erosion[Dilation[Binarize[ImageSubtract[r, g]], n], n]];
ReliefPlot[Reverse@ImageData@DistanceTransform[ColorNegate[string]]]




(此处显示的所有代码均为Mathematica 8。)

识别明显的“山脊”(必须包含将两个相邻Voronoi单元格分开的所有点)并将它们与线层重新组合提供了我们需要进行的大多数工作:

ridges = Binarize[ColorNegate[
   LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]




红色带表示我可以保存的直线,而青色带表示距离变换中的波峰。 (由于原始行本身的中断,仍然有很多垃圾。)这些脊需要通过进一步的扩张进行清理和封闭(两个像素可以做到),然后我们才能确定由原始线和它们之间的脊线(其中一些线需要明确地重新组合):

Dilation[MorphologicalComponents[
  ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]


实际上,这是要识别五个定向的线性特征。我们可以看到从汇合点发出的三个独立的线性特征。每个都有两个方面。我认为两个最右边的功能的右侧相同,但是在其他方面却有所区别,给出了五个功能。彩色区域显示了这五个功能的Voronoi图。


基于区分三个线性特征的图层的欧几里得分配命令(我无法在此插图中使用)不会区分每个线性特征的不同面,因此它将结合最左边一行的绿色和橙色区域;它将最右边的蓝绿色特征一分为二;

很明显,这种栅格方法可以构造任意特征的Voronoi镶嵌,包括点,线性片断和甚至多边形,无论它们的形状如何,它都可以区分线性要素的边。

评论


在mathematica.stackexchange.com/questions/20696/…中说明了类似的解决方案。

– hu
13年5月5日在21:14

#2 楼

我认为您可以:


将线顶点转换为点(line_points)。
使用点(line_points)制作voronoi多边形。

我希望我真的了解你的问题,如果不能的话,你可以提供一张图来解释你的需求吗?

评论


我认为您理解了这一点,但我确实想到了解决方案,但是您遇到了线较少顶点的问题。我将用屏幕截图更新我的问题。

– Dan C
13年4月4日在17:01

如果沿线使点更密集,则可以正常工作。尽管我会怀疑基于栅格的方法(如问题评论中提到的那样)会比这有效得多。

– Andy W
13年4月4日在18:08