首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将粗2D线渲染为多边形?

如何将粗2D线渲染为多边形?
EN

Stack Overflow用户
提问于 2009-03-26 19:18:45
回答 9查看 12.4K关注 0票数 24

我有一个由二维点列表组成的路径。我想把它们变成一个三角形的条带,以便渲染一条具有指定粗细的纹理线条(以及其他类似的东西)。因此,从本质上讲,2D点的列表需要成为指定多边形轮廓的顶点列表,如果进行渲染,多边形的轮廓将呈现该线。问题是处理角连接、斜接、封口等。生成的多边形需要在没有透支、干净连接等意义上是“完美的”,以便可以可行地挤出或以其他方式玩弄。

有没有什么简单的资源可以提供算法洞察力,代码或更多的信息来有效地做到这一点?

我绝对不想要一个完整的2D向量库(cairo、antigrain、OpenVG等)。有曲线,弧线,破折号和所有的铃声。我一直在挖掘OpenVG实现的多个源码树和其他东西,以找到一些见解,但这些都非常复杂。

我当然愿意自己编写代码,但有许多退化的情况(小段+粗宽+尖角)会造成各种连接问题。即使是一点帮助也能帮我省下几个小时来尝试处理所有这些问题。

编辑:这是一个退化的例子,如果你只是从一个顶点到另一个顶点,它会导致丑陋。红色是原始路径。橙色块是以指定宽度绘制的矩形,在每个线段上对齐并居中。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-03-27 06:35:35

哦,好吧--我试着自己解决这个问题。我在试图解决零透支问题的解决方案上浪费了两个月的时间。正如你已经发现的,你不可能处理所有退化的情况,并且同时拥有零透支。

但是,您可以使用混合方法:

自己写一个例程,检查连接是否可以从简单的几何构造而没有问题。为此,您必须检查连接角度、线的宽度和连接的线段的长度(短于其宽度的线段是皮塔)。使用一些启发式方法,你应该能够理清所有琐碎的情况。

我不知道你的平均线条数据是什么样的,但在我的例子中,超过90%的宽线没有退化的情况。

对于所有其他行:

你很可能已经发现,如果你容忍透支,生成几何图形要容易得多。这样做,让多边形CSG算法和镶嵌细分算法来完成这项艰巨的工作。

我已经评估了大多数可用的镶嵌包,最后我使用了GLU镶嵌器。它速度快,健壮,从不崩溃(与大多数其他算法不同)。它是免费的,许可证允许我将其包含在商业程序中。细分的质量和速度都是正常的。你不会得到delaunay三角剖分的质量,但因为你只需要渲染的三角形,这不是问题。

因为我不喜欢tesselator API,所以我从免费的SGI OpenGL参考实现中删除了tesselation代码,重写了整个前端,并添加了内存池以减少分配数量。这花了两天的时间,但这是非常值得的(比如第五个因素的性能提升)。该解决方案最终成为一个商业OpenVG实现:-)

如果在PC上使用OpenGL进行渲染,则可能需要将镶嵌/CSG作业从中央处理器移动到图形处理器,并使用模板缓冲区或z缓冲区技巧来消除透支。这比CPU镶嵌要容易得多,甚至可能更快。

票数 4
EN

Stack Overflow用户

发布于 2014-10-28 07:35:14

http://www.codeproject.com/Articles/226569/Drawing-polylines-by-tessellation

它看起来完全是你想要的,它的许可证甚至允许在商业应用中使用它。我可能会在某一时刻尝试用它来替换我自己的不太完美的实现。

票数 3
EN

Stack Overflow用户

发布于 2009-03-26 21:03:56

一个简单的方法从我的头顶。

将每个2d顶点的角度一分为二,这将创建一条漂亮的斜接线。然后沿着这条线向内和向外移动,你的“厚度”(或厚度除以2?)的量,你现在就有了内部和外部多边形点。移动到下一个点,重复相同的过程,在此过程中构建新的多边形点。然后应用三种语言来获得渲染准备就绪的顶点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/687173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档