在CNC上,通常不仅仅是 2D,因为还有速度、每个轴运动学不止一个执行器的工具角度等……为此,我通常使用带参数的参数三次方t=<0.0,1.0>
。所以我将路径转换为一组三次曲线,这些三次曲线很容易在任何维度上进行评估。完成此步骤后,您将获得 3 种常用的光栅化方法:
恒dt
步
参数三次通常是非线性的,因此为了移动到另一个像素(或其他),您需要以t
小于分辨率的步长来增加参数,例如:
dt < 1.0 / curve_length
越少越好dt
,你不会错过一个像素,但粗糙的会有更多的重复位置。
搜索dt
下一步
使用二进制搜索,您可以找到下一个t
,因此到当前位置的距离是单个像素。这更精确,但在某种程度上也更慢......
转换为线条
您可以将三次曲线采样成一组线条(多少取决于曲线的大小)并像往常一样使用 DDA 或 Bresenham 栅格化线条。这是最简单的,但结果不会完全是一条曲线。
立方是这样的:
P(t) = a0 + a1*t + a2*t^2 + a3*t^3
t = <0.0,1.0>
其中P(t)
是位置,a0,a1,a2,a3
是向量 m 中的系数,其中每个轴都有自己的标量系数。
请参阅如何生成多点线性插值?以及如何使用/计算它们的子链接。
无论如何,如果您坚持假设圆弧进行圆弧插值:
P(t) = ( Rotation_matrix(t) * (P0 - Pcenter) ) + Pcenter
t = <0.0,2*PI>
Where将您的Rotation_matrix
点沿曲线方向旋转,并且是起点并且是圆弧的中心。(0,0,0,...,0)
t [rad]
P0
Pcenter
在非轴对齐旋转的情况下,您可以使用Rodrigues_rotation_formula代替。
然而,使用齐次变换矩阵是 ND 中的最佳选择,您只需扩大矩阵大小: