背景:
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的实施,请检查“实施”。