PDF云注释背后的算法是什么?

时间:2016-01-06 00:45:14

标签: c# algorithm pdf graphics 2d

我注意到有几个PDF Annotation应用程序(Adobe Acrobat,Bluebeam等)有一个算法可以在多边形周围创建云模式:

Cloud Annotation in PDF

拖动此多边形的顶点时,将重新计算云图案:

Modified Cloud Annotation in PDF

注意如何重新计算圆弧以包围多边形。它们不会被拉伸或扭曲。无论用什么算法来定义它似乎都是行业标准。有几个PDF编辑器允许您创建它,并且在每个编辑器中,拖动顶点时云弧看起来都一样。

我正在尝试创建一个复制它的WPF示例应用程序,但我似乎无法在任何地方找到用于生成云模式的文档。

我对图形设计和2D编程非常流利,而且我能够创建拖动顶点的工具,但我需要帮助来弄清楚如何绘制这些弧。它看起来像ArcSegments中的一系列PathGeometry

所以我的问题是,在多边形周围创建这些弧的算法是什么?

在哪里可以找到这些行业标准PDF模式,图纸和/或注释的文档? (云,箭头,边界等)

1 个答案:

答案 0 :(得分:14)

草图中的云只是沿着每个多边形边缘绘制的一系列圆圈,并且有一定的重叠。

绘制填充的基本云形状的简单方法是首先填充多边形,然后在填充多边形的顶部绘制圆圈。

当你想用部分透明的颜色填充云时,这种方法会变得平坦,因为圆与彼此和基本多边形的重叠将被涂成两次。它也会错过云曲线上的小卡通式超调。

绘制云的更好方法是首先创建所有圆,然后确定每个圆与其下一个邻居的交叉角。然后,您可以创建一个包含圆弧段的路径,您可以填充该路径。轮廓由独立的弧组成,末端角度偏移很小。

在您的示例中,云弧之间的距离是静态的。通过使该距离可变并且通过强制多边形边缘可被该距离均匀整除,可以很容易地使多边形顶点处的圆弧重合。

下面是JavaScript中的示例实现(没有多边形拖动)。我不熟悉C#,但我认为基本算法很清楚。代码是一个完整的网页,您可以在支持画布的浏览器中保存和显示;我在Firefox中测试过它。

绘制云的功能采用选项对象,例如半径,弧距和以度为单位的过冲。我没有测试像小多边形这样的退化情况,但在极端情况下,算法应该只为每个多边形顶点绘制一个弧。

必须顺时针定义多边形。否则,云将更像是云层中的一个洞。如果角落弧周围没有任何人工制品,这将是一个很好的功能。

修改:我为下面的云算法提供了simple online test page。该页面允许您使用各种参数。它也很好地显示了算法的缺点。 (在FF和Chrome中测试过。)

当未正确确定起始角和结束角时,会出现伪影。对于非常钝的角度,角落旁边的弧线之间也可能存在交叉点。我没有解决这个问题,但我也没有考虑过muczh的想法。)

index.html