如题,过直线外一点做圆的切线。
如图,已知圆心坐标O,圆半径OC=OD=r,以及圆外一点A的坐标,AC、AB与圆相切,求C点坐标,B点坐标。
计算方法很多,比如联立方程组,然后解方程;比如计算以A为原点,切线的角度以及长度。
这里联结BC,交OA于D,BC为圆的一条弦,通过向量的方式求解BC点的坐标。
先看效果:
思路:
先求出OD的长度,可以使用相似三角形的知识,OC/OD=OA/OC;
向量OD和OA的方向相同,可以求出向量OD;
DC和DB垂直于OD,可以求出向量DC和DB的方向;
使用勾股定理,可以求出DC的长度,DC和DB长度相同。
O点坐标已知,又求出了向量OD和DC、DB,就求得了C点和D点的坐标。
核心方法如下:
/** * 计算切点坐标 * @param op 圆心坐标 * @param p1 圆外一点坐标 * @param r 圆半径 * @param dir 切线方向,1/-1。因为过圆外一点有两条切线。 * @return */ private function getPointOfTangency(op:Point, p1:Point, r:Number,dir:int=1):Point { var p:Point = new Point(); var vecC:Point = new Point(p1.x - op.x, p1.y - op.y); var c:Number = vecC.length; var dc:Number = r * r / c; var vecDc:Point = vecC.clone(); vecDc.normalize(dc); var vecDl:Point = new Point( -vecDc.y, vecDc.x); var dL:Number = Math.sqrt(r * r - dc * dc); vecDl.normalize(dL*dir); p.x = op.x + vecDc.x + vecDl.x; p.y = op.y + vecDc.y + vecDl.y; return p; }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。