在曲线上应用笔划时如何避免自相交?


11

我的代码中有几个Spline2D对象,每个对象都有一个Position,Velocity和Acceleration方法,该方法在特定时间返回指定数量的向量。我一直在使用这些向量来构造几何图形以创建曲线的渐变笔触,但是我在陡峭曲线处的自相交方面遇到了问题。例如,这是发生这种情况的一条曲线:

线框:http : //twitpic.com/2zplw1/full
填充:http : //twitpic.com/2zpmnt/full

如您所见,在第二个弯曲处,内部相交,这导致了丑陋的伪影。在不引起自相交的情况下,是否有很好的算法/方法可以绘制曲线?

编辑:更多极端的例子,再加上我想要实现的模型:

线框:http : //twitpic.com/2ztwzi/full
填充:http : //twitpic.com/2ztwkt/full
理想结果(模拟):http : //twitpic.com/2ztxa8/full


哇,我甚至在写标题时都没有意识到标题的含义。:)
ThatsGobbles 2010年

Answers:


3

如果要使用GPU和任何现代3D api(例如OpenGL / D3D)渲染这些图像,在我看来,您可以通过深度测试摆脱这些。如果将外部顶点指定为z = FAR,而将内部顶点指定为z = NEAR,则深度测试应防止显示重叠。使用OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

请注意:如果需要半透明的笔触,此操作将无效。


1
很好的答案,正好是我的想法,但是,如果允许一次写入zbuffer,然后第二次进行彩色处理,那么您就错了,它对半透明笔触无效。
理查德·法比安

谢谢,我的笔触确实是不透明的,所以这非常简单而美妙!
ThatsGobbles

1

“修复”将取决于您希望结果输出看起来像什么。这个问题在这里还没有被很好地定义:看起来是什么意思?

我建议您首先尝试对故障进行更极端的示例,然后使用photoshop / paint对其进行修复,您可能会从中找到解决方案的灵感。

您要折叠吗?与边缘重叠?拉入直到不重叠?


好点,今天晚些时候,我将在Illustrator或Inkscape中绘制一条更锐利的曲线,并绘制一条“理想”曲线。
ThatsGobbles 2010年

原始帖子已编辑!
ThatsGobbles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.