了解 inkscape 贝塞尔曲线展平算法
understand inkscape bezier flattening algorithm
您好,我正在将 svg 转换为 hpgl 格式。我使用的绘图仪只理解不理解贝塞尔曲线的第一个 hpgl 版本。所以我正在尝试将使曲线变平的 inkscape 函数转换为从 python 到 javascript 的线段。
我正在阅读 4 个文件,我有点迷失在所有数学知识中。
在 hpgle_encode.py there is a call to fucntion named cspsubdiv i think it stands for cubic super path sub division and from what i understood it is a recursive call that split every bezier cuvre in two (with De Casteljau's Algorithm) until the number of polyline is flat enough. this is determined by the distanceToPoint found in the ffgeom。我不明白的是 c1 和 c2 代表什么以及距离计算背后的数学概念是什么。我也不明白 subdiv 函数的递归部分。我无法调试 inkscape 扩展,所以我看不到 sp [i] 代表什么:
def subdiv(sp,flat,i=1):
while i < len(sp):
p0 = sp[i-1][1]
p1 = sp[i-1][2]
p2 = sp[i][0]
p3 = sp[i][1]
b = (p0,p1,p2,p3)
m = maxdist(b)
if m <= flat:
i += 1
else:
one, two = beziersplitatt(b,0.5)
sp[i-1][2] = one[1]
sp[i][0] = two[2]
p = [one[2],one[3],two[1]]
sp[i:1] = [p]
您链接到的代码中的 dot()
函数正在计算两个向量的 dot product。
点积计算 "scalar projection",或者一个向量沿另一个向量的长度投影多少。
因此,如果您有一条线段近似于一段曲线,并且贝塞尔曲线控制点用于同一段曲线,那么很明显这对于计算该线段与近似值的接近程度有多大帮助曲线。
控制点离线段越近,线段越准确。当它达到预定的接近度时,您不再需要使用 deCasteljau 将曲线分成两个较小的段。
您好,我正在将 svg 转换为 hpgl 格式。我使用的绘图仪只理解不理解贝塞尔曲线的第一个 hpgl 版本。所以我正在尝试将使曲线变平的 inkscape 函数转换为从 python 到 javascript 的线段。 我正在阅读 4 个文件,我有点迷失在所有数学知识中。 在 hpgle_encode.py there is a call to fucntion named cspsubdiv i think it stands for cubic super path sub division and from what i understood it is a recursive call that split every bezier cuvre in two (with De Casteljau's Algorithm) until the number of polyline is flat enough. this is determined by the distanceToPoint found in the ffgeom。我不明白的是 c1 和 c2 代表什么以及距离计算背后的数学概念是什么。我也不明白 subdiv 函数的递归部分。我无法调试 inkscape 扩展,所以我看不到 sp [i] 代表什么:
def subdiv(sp,flat,i=1):
while i < len(sp):
p0 = sp[i-1][1]
p1 = sp[i-1][2]
p2 = sp[i][0]
p3 = sp[i][1]
b = (p0,p1,p2,p3)
m = maxdist(b)
if m <= flat:
i += 1
else:
one, two = beziersplitatt(b,0.5)
sp[i-1][2] = one[1]
sp[i][0] = two[2]
p = [one[2],one[3],two[1]]
sp[i:1] = [p]
您链接到的代码中的 dot()
函数正在计算两个向量的 dot product。
点积计算 "scalar projection",或者一个向量沿另一个向量的长度投影多少。
因此,如果您有一条线段近似于一段曲线,并且贝塞尔曲线控制点用于同一段曲线,那么很明显这对于计算该线段与近似值的接近程度有多大帮助曲线。
控制点离线段越近,线段越准确。当它达到预定的接近度时,您不再需要使用 deCasteljau 将曲线分成两个较小的段。