在对几何形状进行数学运算时避免被零除的最佳方法

Best way to avoid divide by zero while doing math on geometric shapes

我正在使用 Visual Basic 语言的子集作为其编程语言的专用运动控制器硬件进行编码。我需要对给定点进行一些计算,比如获取通过 3 个不同点的圆弧的中心坐标;移动线,获取 2 条线的交点坐标等...

我正在使用笛卡尔坐标系进行计算。在处理 divide by zero 个案例时,代码似乎会变得臃肿。

那么,进行此类计算的最佳坐标系是什么?或者保持此类代码小的最佳方法是什么?

例子

通过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

如您所见,有很多情况会导致divide by zero异常。我应该使用 if/else 结构还是有更好的方法?

计算通过3个点的圆弧的圆心时,肯定需要检查这些点是否在同一条直线上。但是重写表达式

if (py2-py1)/(px2-px1) = (py3-py2)/(px3-px2)

避免分裂

Det = (py2-py1) * (px3-px2) - (py3-py2) * (px2-px1) 
if Det = 0 then ... `bad case

对于其他情况(Det<>0) arc 存在,并且您可以找到没有零除错误的中心坐标

center_x= ((py2-py1) * (py3-py2) * (py3-py1) + 
          (py2-py1) *(px2+px3) * (px3-px2) - 
          (py3-py2) * (px1+px2) * (px2-px1)) / (2 * Det)