离散步骤绘制弧线

| 下午好, 背景 我的问题涉及使用离散步长绘制空间中的任意弧线。但是,它的独特之处在于,我不是用典型的意义来画画布。我正在设计的固件是用于CNC铣床的gcode解释器,它将命令转换为步进电机的运动。现在,我已经在这个站点上找到了一个类似的问题,但是建议的方法(Bresenham算法)对于在空间中移动物体似乎是不兼容的,因为它仅依赖于一个圆的一个八分圆的计算。然后围绕其余对称轴镜像。此外,计算两个任意角度之间的弧线的规定方法依赖于三角函数(我正在微控制器上实现,如果可能的话,希望避免使用昂贵的三角函数),而不必采取超出范围的步骤。最后,仅将算法设计为沿一个旋转方向(例如,逆时针方向)工作。 题 因此,关于一个实际的问题:是否有人知道一种通用算法,该算法可用于以离散步骤“绘制”任意弧,同时仍然考虑角度方向(CW / CCW)?最终实现将使用C语言完成,但用于该问题的语言无关紧要。 先感谢您。 参考文献 S.O关于使用Bresenham算法绘制简单圆的帖子: 以不连续的x-y步骤“绘制”圆弧 Wiki页面,描述了布雷森汉姆算法的一个圆圈 http://en.wikipedia.org/wiki/Midpoint_circle_algorithm 要执行的Gcode指令(请参阅G2和G3) http://linuxcnc.org/docs/html/gcode.html     
已邀请:
        通过将任意有理曲线转换为有理贝塞尔曲线,然后应用de Casteljau's算法,可以准确,快速地解决此问题。对于圆锥像圆和双曲线可以很容易地做到这一点: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/NURBS/RB-conics.html 一旦有了有理的贝塞尔曲线,要将曲线重新采样为离散的步骤,就应该使用de Casteljau算法。该算法使用动态编程,并且非常快速且数值上很健壮。如果您以前从未听说过它,我真的建议您学习它,因为它是一个相当聪明的小算法: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html 然后,可以使用多种方法使用de Casteljau的算法来获取曲线的离散采样。首先,您可以天真地应用它以均匀的增量沿其参数空间评估曲线。如果增量需要均匀间隔,则必须将插值坐标更改为弧长单位: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/curves/continuity.html#Arc-Length-Parameterization 该技术的一种改进是改为转换成弦长参数化,该参数化随时间推移接近弧长参数化: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/INT-APP/PARA-chord-length.html 最后,如果曲线上需要很多点,则只需应用de Casteljau算法作为拐角切割程序即可将初始控制点矢量细化为极限多边形,该多边形可以任意逼近所需曲线,直至某些用户指定公差: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-sub.html 这些笔记摘自C.K. Shene的课程笔记,这是学习样条曲线和细分曲面的重要资源: http://www.cs.mtu.edu/~shene/COURSES/cs3621/注意/     
这是一个愚蠢的想法,但它可能会起作用 计算计算机上每个可能半径的圆,并将此信息保存在微型控制器内存中。 假设您有1到1000像素半径的圆。那就是所有圈子上的1000 *(1000 + 1)/ 2 * 2 * pi = 300万点 对于每个点,您实际上只需要与上一个点的偏移量,共有8种情况,可以将其编码为3位 取决于您的微控制器有多少位,例如8/16位,是2像素/字节还是5像素/字 8位微型计算机将需要1.5MB的内存,16位微型计算机将需要1.2MB的内存。 您可以按半径k像素的增量存储圆,并且仅使用1.5MB / k的内存。 另一个优化方法是将圆建模为具有多个边的多边形,而不是将偏移量保持到上一个点,而是将偏移量保持在距两步或更多步的点上,并以某种方式对它们之间的像素进行插值。 如果您将像素的偏移量保持两步之遥,则有16种情况,以4位编码=> 3/2百万点=> 750KBytes 如果每s步保持一个像素,则有s * 8种可能性,可以将其编码为3 + log2(s)位。 LE: 每32步/ 8密耳像素数=> 10英寸半径圆圈10 * 4000 * 2 * pi / 32步* 1byte = 7.85KB, 每128steps / 32mils像素=> 10inch半径圆圈10 * 4000 * 2 * pi / 128 * 10bits = 19634Kbits = 2.4KB LLE: 您实际上没有s * 8的可能性,因为它有一个较小的可能性,因为放大的圆是一条直线 这一切都取决于您可以打包数据或使用外部存储器的程度 另一个优化:仅存储象限或八分之一,其余部分对称 LLLE: 每一个     

要回复问题请先登录注册