5

我关心的是二次贝塞尔三角形,我试图对其进行镶嵌以渲染它们。

我已经设法通过递归地细分三角形来实现这一点,就像在维基百科页面中描述的那样。虽然我想获得更精确的细分。问题是我会得到太少或太多的细分,因为在该算法的每次迭代中表面的数量都会翻倍。

特别是我需要一个自适应镶嵌算法,它允许我定义边缘的段数量。我不确定我是否能做到这一点,所以我也想听听统一镶嵌技术。

最难的麻烦我在计算贝塞尔曲面上的点的法线时遇到了麻烦,我不确定我是否需要,但一直在尝试解决。

4

1 回答 1

1

自适应细分。这有很多算法。但这里有一个:

def line_angle((x0,y0),(x1,y1)):
    return atan2(y1-y0,x1-x0)

def adaptive_bezier(p0,p1,p2,lev=32):
    p01 = midpoint(p0,p1)
    p12 = midpoint(p1,p2)
    m = midpoint(p01, p12)
    da = abs(line_angle(p0,p1) - line_angle(p1,p2))
    if da <= max_tolerance or lev <= 0:
        yield m
    else:
        for p in adaptive_bezier(p0,p01,m,lev-1): yield p
        for p in adaptive_bezier(m,p12,p2,lev-1): yield p

对于以这种方式镶嵌三角形来说,这件事很复杂。您需要根据边缘贝塞尔曲线的角度来驱动自适应 tesselator 算法。在细分时,您的三角形可以通过三种独特的方式进行分割。

 2 edges      one edge     3 edges    
--------     ---------    --------
\  ...//     \   |   /    \ /  \ /
 \/___/       \  |  /      \____/
  \  /         \ | /        \  /
   \/           \|/          \/

为这些模式定义曲面细分结果,您就很好了。维基百科文章中仅描述了具有一个边缘的镶嵌。

通过研究一个边缘分裂的情况,可以获得另外两个细分结果。

“2 条边”可以通过拆分第一个边然后另一个边直接获得。

“3 个边缘”需要更多的工作才能找到。但是您可以看到“2 个边缘”案例为您带来了一个中间边缘。在二次贝塞尔三角形的情况下,它是出现在那里的菱形的平均总和:

--------      /\
\      /     /  \
 \____/     -____-
  \  /       \  /
   \/         \/
于 2010-05-19T06:49:42.570 回答