09
2017
10

圆外一点到圆的切线

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

切线.png

如图,已知圆心坐标O,圆半径OC=OD=r,以及圆外一点A的坐标,AC、AB与圆相切,求C点坐标,B点坐标。

计算方法很多,比如联立方程组,然后解方程;比如计算以A为原点,切线的角度以及长度。

这里联结BC,交OA于D,BC为圆的一条弦,通过向量的方式求解BC点的坐标。

先看效果:

获得 Adobe Flash Player

思路:

先求出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;
		}



源码打包下载

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。