本帖最后由 作者 于 2007-5-29 9:26:24 编辑
圆的公切线(二) B 解析几何方法: 为求解公切线, 首先要确定是画外公切线, 还是内公切线. 可以通过对话框或输入关键词来确定是画外公切线, 还是内公切线. 由于一般情况下外公切线和内公切线各有两条, 所以还得确定画在什么位置. 此处采用以下方法: 如下图所示, 在选择圆时, 使选择点S1, S2靠近公切线的切点T1, T2(大概范围, 应远离由两圆心P1, P2确定直线), 当选择点(S1, S2)在由两圆心确定直线的同一侧时, 就在相应的一侧画外公切线, 不在同一侧时, 就在相应的部位画内公切线. 同一侧 异侧 设以P1为起点, 以P2, S1, S2为终点的矢量的单位长度矢量分别为V0, V1和V2. V0= (P2 - P1)/|P2 - P1| V1=(S1 - P1)/|S1 - P1| V2=(S2 - P1)/|S2 - P1| 关于"已知一直线(给定不重合的两端点P1, P2), 确定两点S1, S2是否在直线的同一侧?"的问题, 感兴趣者请参考帖子"点在直线哪一侧问题的求解".1. 两圆的外公切线 这时选择点S1与S2在过两圆心P1, P2的直线的同一侧, 即 (V0×V1) · (V0×V2) > 0 外公切线 1.1 |r1-r2|<d 如上图, 假设r1>r2. 以P1为圆心, r1-r2为半径画圆为c3, 又以M为圆心, d/2为半径画圆为c4, 则圆c3与圆c4相交于点Q (有两点), 已P1为起点, 过点Q可作1条射线, 该射线交圆c1于点T1(外公切线与圆c1相切的点), 过P2作P1T1的平行线, 交圆c2于点T2(与点T1在线段P1P2的同侧). 因为点Q有两点, 所以总共可求得两组外公切线. 以下用解析几何方法求T1与T2(数组的索引从0开始). 设T1 = (T1(0), T1(1), T1(2) )T, T2 = (T2(0), T2(1), T2(2) )T, 又设角P2P1Q为q (逆时针旋转为正), 则 -π/2 < q < π/2 cosq = (r1 - r2) / d >0 (上述模型中r1-r2为圆c3的半径, 必须满足r1>r2 *1) 因为点Q有两点, 所以 q = ±Arccos((r1 - r2) / d) q 的符号可由外积(V0×V1)与z轴的正方向(0, 0, 1)T按以下方法确定, 当 (V0×V1) · (0, 0, 1)T > 0, 即V0(0)V1(1) - V0(1)V1(0) > 0 时, q = Arccos((r1 - r2) / d) 当 (V0×V1) · (0, 0, 1)T < 0, 即V0(0)V1(1) - V0(1)V1(0) < 0 时, q = -Arccos((r1 - r2) / d) 设以P1为起点, 以T1为终点的矢量的单位长度矢量为V3, 则 V3 = P1T1 / |P1T1| (未知) 未知单位长度矢量V3可以由单位长度矢量V0按逆时针旋转q 弧度获得. 而矢量按逆时针旋转q 弧度, 就相当于对应的坐标轴按逆时针旋转-q 弧度而得到的结果, 这时的坐标旋转转换矩阵a为 由坐标转换, 矢量V3可由下式计算 V3(i) =a(i, j) V0(j) (i=0,2; j=0,2) 所以, T1(i) = 1(i) + r1V3(i) (i=0,2) T2(i) = 2(i) + r2V3(i) (i=0,2) 注*1: 当r1=r2时, 虽然用前述的几何法无法做出公切线, 但解析方法仍然可以正确地求出T1与T2 (此时, q = ±π/2); 当r1<r2时, 可同时互换P1与P2, r1与r2的值, 以满足r1<r2的要求. 1.2 |r1-r2|=d 1.2.1 d=0 (r1=r2) 两圆重合, 有无数的外公切线(无意义, 应排除). 1.2.2 d≠0 两圆内切, 两圆外公切线的切点T1和T2均与两圆切点重合. 过两圆切点作直线段P1P2的垂线, 该垂线就是外公切线(只有一组). 切点T1和T2可以用1.1的方法算出. 1.3 |r1-r2|>d 无公切线 |