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

Geometry 在对几何形状进行数学运算时避免被零除的最佳方法,geometry,coordinate-systems,divide-by-zero,Geometry,Coordinate Systems,Divide By Zero,我在一个专门的运动控制器硬件上编码,它使用Visual Basic语言的一个子集作为编程语言。我需要对给定的点做一些计算,比如得到一条弧的中心坐标,它通过3个不同的点;移动直线,获取两条直线的交点坐标等 我使用笛卡尔坐标系进行计算。处理除以零的情况时,代码似乎会膨胀 那么,这种计算的最佳坐标系是什么?或者什么是保持这种代码小型化的最佳方法 例子 给出通过3个点的圆弧中心点坐标的代码如下: ' p1: (px1, py1) p2: (px2, py2) p3: (px3, py3)

我在一个专门的运动控制器硬件上编码,它使用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)
避免分裂

Det = (py2-py1) * (px3-px2) - (py3-py2) * (px2-px1) 
if Det = 0 then ... `bad case
对于else情况(Det0),圆弧存在,并且您可以找到中心坐标,而不存在零分误差

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

框架是否支持try/catch块?如果是这样,请使用它不,它甚至不支持定义函数(只能使用
GOSUB
命令)(是的,真的)它有类似于OnError:goto-line xxxx的东西吗?它有类似的东西,但关键是要尽可能保持代码干净和简短。如果我使用该结构,任何异常都将由该例程处理,这将使代码变得通俗易懂(无论如何,我没有意识到使用try/catch的意义。使用try/catch和If/else块有什么区别?)是的,这是可能的错误原因之一。我也必须处理这个问题,但当其中两个点形成一条坡度为90度(或0度)的直线时,我面临着被零除的问题。你根本不需要计算坡度。我重写了最后一个没有它们的表达式(没有彻底检查)。我也没有检查你的
center\u x=…
公式,但你建议的方法似乎是最简单(更清晰)的方法。谢谢