rendering - 如何镶嵌贝塞尔三角形?

标签 rendering tesselation

我关心的是二次贝塞尔三角形,我正试图将其镶嵌以呈现它们。

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

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

最难的问题我在计算贝塞尔曲面中的一个点的法线时遇到了麻烦,我不确定是否需要,但一直在努力解决。

最佳答案

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

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

对于以这种方式分割三角形,事情会很复杂。您需要根据边缘贝塞尔曲线的角度来驱动自适应曲面分割算法。在分割时,您的三角形可以通过三种独特的方式进行分割。
 2 edges      one edge     3 edges    
--------     ---------    --------
\  ...//     \   |   /    \ /  \ /
 \/___/       \  |  /      \____/
  \  /         \ | /        \  /
   \/           \|/          \/

为这些模式定义曲面分割结果,您就大功告成了。维基百科文章中仅描述了具有一条边的曲面分割。

通过研究一条边 split 的情况,可以得到另外两个分割结果。

“2 条边”可以通过先分割一条边然后再分割另一条来直接获得。

“3 条边”需要更多的工作来找出。但是您可以看到“2 边”-case 为您带来了中边。在二次贝塞尔三角形的情况下,它是出现在那里的菱形的平均总和:
--------      /\
\      /     /  \
 \____/     -____-
  \  /       \  /
   \/         \/

关于rendering - 如何镶嵌贝塞尔三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565635/

相关文章:

google-chrome - 2016 年 chrome 整体字体渲染问题

macos - Ubuntu/OSX 上 PhantomJS 的字体渲染差异

opengl - 在 DirectX 中使用 GLUTesselator 可以吗?

r - 在不规则网格上绘制和着色数据

python - 在 python 中渲染矢量字母

java - 第一次加载 Android 时 HIGHChart 不显示图表

wpf - 如何提高 Canvas 渲染性能?

algorithm - 如何将多边形转换为非重叠三角形的集合?

math - 用六角形 map block 覆盖地球

c++ - glPolygonMode 未以正确模式呈现