本帖最后由 作者 于 2007-3-31 22:04:13 编辑
你不是求出圆心了吗?不用做辅助线就可以判断是否相切。思路如下: 求被判断点与直线的距离,以及与圆弧的距离。判断这两个距离是否相差很小就判断通过。 1、要排除精度上的误差:定义 Dim pi As Double pi = Atn(1) * 4 这样不会造成尽量减少精度问题,不会因为你输入错一位pi而出错。 只要判断距离相对误差为小于10^-10则通过。diouble型函数为16位精度,一般误差在最后两位上,如果多次运算,误差会放大,取10^-10差不多了。这样运算出来,应该满足要求了。 2、以下是我工程用到的公用函数,里面有求点与直线距离函数。纯数学的。 今晚忙,没有给你推公式出来,你修改一下就可以用。 Public Function UPDown(X1, Y1, x2, y2, x3, y3) '求点(X3,y3)在直线12的上方还是下方. '直线方程AX+BY+C=0 变为Y=KX+t Dim A, B, C, x4, y4 As Double If x2 <> X1 Then '两点式转化会斜切式 A = (y2 - Y1) / (x2 - X1) C = (Y1 * x2 - X1 * y2) / (x2 - X1) B = -1 '对称点坐标,你可以运算出点与直线距离了。我没有直接给出。 x4 = ((b ^ 2 - A ^ 2) * x3 - 2 * A * b * y3 - 2 * A * C) / (A ^ 2 + b ^ 2) y4 = ((A ^ 2 - b ^ 2) * y3 - 2 * A * b * x3 - 2 * b * C) / (A ^ 2 + b ^ 2) '点关于直线的对称点。 else 'else 自己写。 end if end sub 同样,你也可以运算出点与圆弧距离,圆弧可以求出圆心,圆心与点距离公式可以直接求出。 以下,估计你会可能用到的。 Private Function ABJD(X1, x2, x3, x4, Y1, y2, y3, y4) '公用函数,返回两线交点,1,2为一直线,3,4 为一直线 If (y2 - Y1) * (x4 - x3) - (y4 - y3) * (x2 - X1) = 0 Then ABJD(0) = 0 ABJD(1) = 0 Else X = (x2 * (y2 - Y1) * (x4 - x3) - x4 * (y4 - y3) * (x2 - X1) + (y4 - y2) * (x4 - x3) * (x2 - X1)) / ((y2 - Y1) * (x4 - x3) - (y4 - y3) * (x2 - X1)) Y = (y2 - Y1) * (X - x2) / (x2 - X1) + y2 ABJD(0) = X ABJD(1) = Y End If End Function Public Function Distance(X1, x2, Y1, y2) '公用函数,求两点距离 Distance = Sqr((X1 - x2) ^ 2 + (Y1 - y2) ^ 2) End Function |