江南桃花家版型:求算法。已知圆外一点求切点

来源:百度文库 编辑:高校问答 时间:2024/05/03 10:38:53
圆心(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则得到一个切点,你说错不错?
实际解决问题中,我们要的不是全解,而是其中一个。建议你看
看全面,实际运行一下代码,你就会发现这个没有问题的。

呵呵!楼上的不必看了!肯定不对!因为这样的点肯定有2个。

b-y/a-x)*(n-y/m-x)=-1
(a-x)平方+(b-y)平方=r平方
联立方程组求解

加入收藏

两个点是可以直接计算的

1 计算外点和圆心之间的距离d,并且和r比较,判断是否在圆心内,在内则没有解

2 定义两个角度
让 alpha = arccos(r/d)
让 beta = arctan((外点.y - 内点.y)/(外点.x - 内点.x) )

3 直接计算出两个切点
p1.x = 圆心.x + r * cos(alpha + beta )
p1.y = 圆心.y + r * sin(alpha + beta )

p2.x = 圆心.x + r * cos( beta - alpha )
p2.y = 圆心.x + r * sin( beta - alpha )

利用三角函数的知识,直接把参数带入计算,并不需要真正的三角函数的计算

最终的计算量,只是几次sqrt的计算和四则运算

是编程吧