求算法。已知圆外一点求切点

来源:百度知道 编辑:UC知道 时间:2024/07/11 19:25:04
圆心(a,b),半径r
圆外一点坐标(m,n)

求其切点的坐标(x,y)

哪位大大有好的算法,
请写出函数,我给高分
即过圆外一点(m,n)求切点坐标
大家快来拿分啊。
纯数学问题。
请写出函数啊。
比如
CPoint CalcQieDian(CPoint ptCenter, CPoint ptOutside, double dbRadious)
{
//大家来补充啊
}

拜托楼下的几位小哥,
我要求把函数写完。
请贴出自己的计算函数,
不然不加分的啊。]

谢谢lishimin1972,我正在测试
wangtk1982 专家同志可不可以帮哈忙呢?

lishimin1972,我测试有点问题,我再仔细看下,
如果没问题我肯定会给你加分的。
另外,我又发了一篇关于切点,比这个简单,
有时间看看吧。多谢
链接是
http://zhidao.baidu.com/question/8559466.html

CPoint CalcQieDian(CPoint ptCenter, CPoint ptOutside, double dbRadious)
{
struct point {double x, y;};
point E,F,G,H;
double r=dbRadious;
//1. 坐标平移到圆心ptCenter处,求园外点的新坐标E
E.x= ptOutside.x-ptCenter.x;
E.y= ptOutside.y-ptCenter.y; //平移变换到E

//2. 求园与OE的交点坐标F, 相当于E的缩放变换
double t= r / sqrt (E.x * E.x + E.y * E.y); //得到缩放比例
F.x= E.x * t; F.y= E.y * t; //缩放变换到F

//3. 将E旋转变换角度a到切点G,其中cos(a)=r/OF=t, 所以a=arccos(t);
double a=acos(t); //得到旋转角度
G.x=F.x*cos(a) -F.y*sin(a);
G.y=F.x*sin(a) +F.y*cos(a); //旋转变换到G

//4. 将G平移到原来的坐标下得到新坐标H
H.x=G.x+ptCenter.x;
H.y=G.y+ptCenter.y; //平移变换到H

//5. 返回H
return CPoint(int(H.x),int(H.y));
//6. 实际应用过程中,只要一个中间变量E,其他F,G,H可以不用。
}

wangtk1982 说我不对,因为切点有两个,不错,如果在第3步旋转角度a得到一个切点,旋转角度-a则得到一个切点,你说错不错?
实际解决问题中,我们要的不是全解,而是其中一个。建议你看
看全面,实际运行一下代码,你就会发现这个没有问题的。

呵呵!楼上的不必看了!肯定不对!因