我正在专门的运动 Controller 硬件上进行编码,该硬件使用 Visual Basic 语言的子集作为其编程语言。我需要对给定点进行一些计算,例如获取穿过 3 个不同点的弧的中心坐标;移动线、获取两条线的交点坐标等...
我使用笛卡尔坐标系进行计算。处理除以零
情况时代码似乎会变得臃肿。
那么,进行此类计算的最佳坐标系是什么?或者保持此类代码较小的最佳方法是什么?
示例
给出经过 3 个点的圆弧的中心点坐标的代码如下:
' p1: (px1, py1) p2: (px2, py2) p3: (px3, py3)
' ----------------------------------------------
m_r=(py2-py1)/(px2-px1) ' slope of the line between p1 and p2
m_t=(py3-py2)/(px3-px2) ' slope of the line between p2 and p3
center_x=(m_r*m_t*(py3-py1)+m_r*(px2+px3)-m_t*(px1+px2))/(2*(m_r-m_t))
center_y=(-1/m_r)*(x_mrk-(px1+px2)/2)+(py1+py2)/2
正如您所看到的,有很多情况会导致除以零
异常。我应该使用 if/else
结构还是有更好的方法?
最佳答案
当你计算经过3个点的圆弧的中心点时,你肯定需要检查这些点是否位于同一条线上。但重写表达式
if (py2-py1)/(px2-px1) = (py3-py2)/(px3-px2)
避免 split
Det = (py2-py1) * (px3-px2) - (py3-py2) * (px2-px1)
if Det = 0 then ... `bad case
对于其他情况(Det<>0)弧存在,并且可以找到没有零除误差的中心坐标
center_x= ((py2-py1) * (py3-py2) * (py3-py1) +
(py2-py1) *(px2+px3) * (px3-px2) -
(py3-py2) * (px1+px2) * (px2-px1)) / (2 * Det)
关于geometry - 在对几何形状进行数学计算时避免被零除的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28640678/