📜  Weiler Atherton –多边形裁剪算法

📅  最后修改于: 2021-04-17 03:36:04             🧑  作者: Mango

背景

Weiler Atherton多边形裁剪算法是一种允许甚至平凹算法都可以裁剪的算法。与Sutherland – Hodgman多边形裁剪算法不同,该算法能够裁剪凹面多边形而不会留下任何残差。

算法

1. First make a list of all intersection points namely i1, i2, i3, ...
 2. Classify those intersection points as entering or exiting.
 3. Now, make two lists, one for the clipping polygon, and the other 
    for the clipped polygon.
 4. Fill both the lists up in such a way that the intersection points 
    lie between the correct vertices of each of the polygon. That is 
    the clipping polygon list is filled up with all the vertices of 
    the clipping polygon along with the intersecting points lying 
    between the corresponding vertices.
 5. Now, start at the 'to be clipped' polygon's list.
 6. Choose the first intersection point which has been labelled as 
    an entering point. Follow the points in the list (looping back to 
    the top of the list, in case the list ends) and keep on pushing 
    them into a vector or something similar of the sorts. Keep on following
    the list until an exiting intersection point is found.
 7. Now switch the list to the 'polygon that is clipping' list, and find
    the exiting the intersection that was previously encountered. Now keep
    on following the points in this list (similar to how we followed the
    previous list) until the entering intersection point is found (the 
    one that was found in the previous 'to be clipped' polygon's list).
 8. This vector now formed by pushing all the encountered points in the 
    two lists, is now the clipped polygon (one of the many clipped 
    polygons if any of the clipping polygons is concave).
 9. Repeat this clipping procedure (i.e. from step 5) until all the 
    entering intersection points have been visited once.

说明

1.查找所有交点并将其分组
在此,有一个多边形ABCD和另一个多边形VWXYZ。令ABCD为剪切多边形,令VWXYZ为剪切多边形。

因此,我们可以使用任何方法找到交点。例如,我们可以分别找到相交点,然后为每个相交点查找是否要进入或离开,或者我们可以使用Cyrus Beck并找到所有相交点,也可以获取点是否正在进入或退出。有关此算法的更多信息,请参考Cyrus Beck。

2.制作并填写两个清单
现在,我们列出两个列表。一个用于剪贴多边形,另一个用于剪贴多边形。
现在这是我们如何填充它:

3.算法的运行
我们从裁剪的多边形列表开始,即VWXYZ。
现在,我们找到了进入的第一个相交点。因此,我们选择i 1
从这里开始,我们开始制作顶点列表(或向量)以制作裁剪的子多边形。

根据给定的示例, i 1 Y i 2是修剪的子多边形。
同样,我们得到:

i 0 V i 3也作为另一个子多边形。

因此,由于进行了多边形剪切,我们得到了两个子多边形,它们涉及一个凹面多边形,结果是:

同样,此裁剪适用于凸多边形。

局限性

尽管已经提出了一些方法也可以解决此问题,但是这种多边形裁剪算法不适用于自相交的多边形,并且已经成功工作。

范例

假设V 1 V 2 V 3 V 4 V 5 V 6为剪切窗口,P 1 P 2 P 3 P 4 P 5 P 6为多边形。
现在,这是算法的运行方式。
生成两个列表,一个用于剪切窗口,另一个用于多边形。我们将从多边形的列表开始。 (请注意,多边形的列表仅包含多边形的顶点和交点,并且对于剪切窗口的列表也类似。)

因此,根据该算法,要形成的第一个多边形将为i 2 i 3 i 8 i 1

然后是下一个子多边形i 4 i 5 i 6 i 7

输出将如下所示:

引文

K. Weiler和P. Atherton。 1988年。使用多边形区域排序进行隐藏表面去除。在教程中:计算机图形学;图像合成,肯尼斯·乔伊(Kenneth I. Joy),查尔斯·W·格兰特(Charles W. Grant),纳尔逊·L·马克斯(Nelson L. Max)和兰辛·哈特菲尔德(Lansing Hatfield)(编辑)。美国纽约州计算机科学出版社,美国209-217。

来源 https://www.cs.drexel.edu/~david/Classes/CS430/HWs/p214-weiler.pdf

有关Weiler Atherton的实施,请检查“实施”。