有没有一种算法能够生成图形轮廓?

5
我在互联网上搜索了一下,可能是我错过了一些正确的关键词,但我没有找到类似的东西。我只找到了折线(或者只有线),这不完全是图形。我想生成一个如图片所示半径为r的图形轮廓。已经有现成的东西了吗?我想避免重复发明轮子。

enter image description here

如果有人能给我一些提示,或者至少告诉我如何做,那就太好了。否则我当然会自己“发明”一个。

最好用C#实现。

更新:我需要计算轮廓多边形,而不仅仅是视觉绘制。绿色点表示结果多边形。也完全忽略“内部”孔。只需要一个轮廓多边形。

更新2:更好的图片展示了一些极端情况。此外,图形的边缘从不重叠,因此不需要考虑这一点。

更新3:再次更新图片以反映斜角连接。


1
如何使用2r的线条粗细绘制每条边?这将使图形轮廓填充! - Hamid Pourjam
1
哦,我不需要绘制它,而是计算出结果多边形。我会编辑问题以反映这一点。好主意。 - SmartK8
会有什么角度?如果像左上角那样的角度变得越来越小,轮廓应该发生什么变化?它应该朝无限远处移动吗?此外:线条是否可以靠近,使轮廓合并? - TaW
以我个人看来,先在高分辨率下绘制图形,然后对于角落的部分进行追踪仍然是一个选项;至少如果分辨率足够好的话。 - TaW
我将绘制一个略微修改的版本,以显示一些重叠。 我会考虑跟踪选项作为最后的选择。 问题是该图像很小,适合SO,但是否则,该图可以非常大(以像素为单位)。 因此,生成的图像将非常大(10k x 10k像素甚至更多)。 - SmartK8
显示剩余8条评论
1个回答

0

首先,针对从点A到B的每个“线段”,生成其所在的矩形(即4个点作为“路径”)。然后搜索两个重叠的矩形并合并它们:

合并有点复杂,其思路是:首先计算所有8条线段的角度(例如,如果沿顺时针方向遍历矩形),然后遍历第一个矩形直到遇到第一条线段交叉点,检查角度确定“外部”方向,并沿着第二个矩形的交叉线移动,直到再次到达起点。此时,你已经遍历了两个矩形的形状(并希望将其保存在某个地方)。

重复合并操作,直到只剩下一个大块(或多个不重叠的小块)。理论上,从任何一个点开始,都可以遍历整个形状,但还存在另一个问题:可能会出现孔洞。
如果一个形状具有两个或更多的不相交点集(其中第2个点集中的任何点都无法从第1个点集中到达,反之亦然),则除了一个不相交路径之外,所有其他路径都是孔洞的一部分。获取实际外边界的简单方法是查找极值,即具有最大或最小X或Y坐标的点(4种组合中只需要一种)。这个点肯定是外边界的一部分。


我知道这只是一个想法,但合并会不会扩展得很糟糕?我的意思是,你合并了两个矩形,但当另一个矩形被合并到它时,你必须再次遍历整个合并后的矩形吗?我将有成千上万条这样的图边。此外,图形永远不会重叠(边交叉另一条边)。但是你提到的洞问题也很深刻,基本上你需要在矩形上执行CSG。但我正在考虑你的解决方案(我的意思是其影响和可行性)。 - SmartK8
抱歉,这里已经是晚上了。第一种方法看起来还不错,通过“旋转”角度直到有交点,但我担心合并成千上万个矩形确实会导致大量的合并和线段交叉 - 这是不可行的(因为这应该是实时的)。我可能不理解极端情况下的第二种方法。因为在我看来,合并两个矩形可以产生6个点的多边形,我不知道如何检测内部(非“极端”)点。如果您愿意,请详细说明一下。 - SmartK8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接