从行数据中获取区域的算法(CAD填充算法)

时间:2014-03-29 18:35:39

标签: algorithm cad

我正在寻找一种算法,该算法从行列表中计算给定点(P)所在的区域。这些行存储有x和y坐标,所得到的区域应存储为多边形,它上面有洞。

这里有两张图片来说明我的意思:

enter image description here

enter image description here

许多CAD应用程序使用此类算法让用户孵化区域。我不知道如何调用这种方法,所以我不知道该搜索什么。

修改1:要清除我要查找的内容:

我不需要算法来计算多边形的面积,我需要一个算法来返回由P周围的线形成的多边形。如果P在任何可能的多边形之外,算法就会失败。

(我也编辑了图片)

编辑2:我已阅读this possible duplicate的已接受答案,并且我正在寻找点位置算法。 我也对this site进行了详细解释,这确切地解释了我正在寻找的内容,更重要的是它引导我进入开源CGAL library,它提供了执行此类操作的功能。 CGAL manual的第4.6点给出了一个示例,说明如何使用此库从一堆线段中形成区域。

1 个答案:

答案 0 :(得分:1)

一种方法是想象一条从P到无穷大的线。对于每个边缘测试每个边缘以查看它是否越过该线。计算交叉的线数。如果它甚至那么该点在多边形之外,如果它是奇数,则该点在多边形内。

这是一个相当标准的数学结果。如果您想深入了解该主题,请查看https://en.wikipedia.org/wiki/Winding_number

本周早些时候,我做了类似的事情Detecting Regions Described by Lines on HTML5 Canvas 这将计算给定一组线的点周围的多边形。您可以在答案中提到的jsfiddle中看到一个工作示例 区别在于它使用无限的数学线而不是线段,但是可以很容易地修改这个例子。

概要算法

首先构造两个数据结构,其中一个线段是线段的交叉点之一。在每条记录中,两条线给出每个交叉点,所以你可以翻转 一个到另一个。您可以通过线段的成对交叉来获得此结果。

在交叉点处切割段可能最容易,因此每个段上只有两个解,每端一个。我们假设我们已经这样做了。

修剪数据结构,删除没有交叉点且只有一个段的所有线段 - 这些段无法贡献。

找到可能的起跑线。您可以计算从每条线到该点的距离并取最小值。您可以检查从点到无穷大的线的交叉点。

逆时针绕多边形走动。随着你的起跑线找到最逆时针的结束。此时找到最逆时针段。然后重复一遍。可能发生闭环形成,在这种情况下丢弃循环中的所有段。继续,直到你回到起点。

检查多边形是否实际包含该点。如果是这样我们就完成了。如果不丢弃多边形中的线段并重新开始。