1

我编写了自己的折线类,它基本上保留了可以使用矩阵修改的点列表。多段线可以添加到其他多段线并在公共端点处连接。当终点等于起点时,折线将代表一个多边形。

然后,我有一种方法可以通过使用一系列 lineTo() 调用迭代点列表来将我的多边形转换为 Path 对象。然后,此路径将作为我 View 的 onDraw 方法中的剪辑路径应用到画布上。

它非常适合复杂的多边形,我可以绘制该路径来验证它的准确性。

到目前为止一切都很好,除了当我有一个中间有一个不规则孔的复合多边形时我注意到了一些问题。我现在应该停止称它为多边形,因为它是另一个多边形内的多边形。

例如,考虑下图,其中外框和中间的“城堡”形状都是用作剪辑路径的同一 Path 对象的一部分。# 代表绘制区域。

+---------+
|#########|
|#+-+#+-+#|
|#| |#| |#|
|#| +-+ |#|
|#|     |#|
|#+-----+#|
|#########|
+---------+

我希望外盒外面和内部“城堡”形状内的所有东西都被剪掉。我看到的问题是内部形状没有被正确剪裁。似乎是光线追踪算法的问题。

任何想法都会有所帮助。

编辑:另外,我尝试测试每个 Region.Op 模式,但都没有解决问题。我怀疑我需要采取措施来检测是否存在“漏洞”并做一些有创意的事情。

4

1 回答 1

2

在花了几天的时间玩这个之后,我已经解决了一半的问题。

我需要设置 Path.FillType :

path.setFillType(Path.FillType.EVEN_ODD)

但后来我遇到了一个相反的情况,只画了中心路径。进行更多调查,我能够通过添加以下内容来解决此问题:

canvas.clipPath(path, Region.Op.DIFFERENCE);

但随后在外部具有单一路径的多边形将其剪辑反转。虽然我很满意我找到了正确的 nerd-knobs 来获得正确的剪辑行为,但我还没有找到一种方法来确定需要哪些剪辑方法。

如果有人有任何想法可以分享,我会很高兴。我怀疑它与将行添加到路径的顺序有关,例如是否在外部定义内部等。

于 2011-04-23T14:10:20.693 回答