如题,过直线外一点做圆的切线。

如图,已知圆心坐标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;
}
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。