无硅油洗发水起静电:继续相切问题。过圆外一点求一个与圆相切的圆的切点

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/29 01:02:21
圆外一点ptOutside,
圆心坐标ptCenter,
半径dbRadious,

求切点,要求写出函数

题目比上一题简单,继续200分!
大家加油。

上一题在
http://zhidao.baidu.com/question/8502169.html
注意:是过圆外一点做一个与已知圆相切的圆
是圆哈,求切点坐标

lishimin1972 ,真是谢谢你啊。
你能不能再写一个啊,
已知的是圆外的圆心,不是该圆上的点。
我搞错了。不好意思。

已知的是圆外的圆心,不是该圆上的点。太简单了:
CPoint CalcQieDian(CPoint ptO1, CPoint ptO2, double dbRadious)
{
CPoint O2=ptO2-ptO1; //坐标变换到ptO1为原点,求ptO2变换后坐标O2
double dbradious=sqrt(O2.x*O2.x+O2.y*O2.y)-dbRadious; //得到切园半径
double t=dbRadious/(dbRadious+dbradious); //缩放变换系数
O2.x=long(O2.x*t); O2.y=long(O2.y*t); //缩放变换即可以得到切点坐标
O2+=ptO1; //坐标变换初试原点
return O2;

}

你的题目少一个条件,就是切园的半径,否则应该是一个园系,要求的
切点应该是无穷多的。
CPoint CalcQieDian(CPoint ptCenter, CPoint ptOutside, double dbRadious, double dbradious)
{
//1.用海伦公式求三角形面积,
//定于ptCenter为三角形ABC的B顶点,ptOutside为C顶点,A为切园圆心, 切点M
double S,s; /*S:三角形面积 s=(a+b+c)/2 */
CSize T=ptOutside-ptCenter;
double a,b,c;
a=sqrt(T.cx*T.cx +T.cy*T.cy);
b=dbRadious;
c=dbRadious+dbradious;
s=(a+b+c)/2;
S=sqrt(s*(s-a)*(s-b)*(s-c));

//2.又S=a*c*sin(B)/2, 求角度B
double sinB=S*2/a/c;
double B=asin(sinB);

//3.求BC线段的角度, tan(alpha)=T.y/T.x
double alpha=atan(T.cy/T.cx);

//4.得到经过切点M的线段AB的角度beta
double beta=alpha-B; /*要得到另外一个切点,则alpha+B */

//5.计算相对于ptCenter的点M的偏移量
T.cx= long(dbRadious*sin(beta));
T.cy= long(dbRadious*cos(beta));

//6.计算最后结果
CPoint M=ptCenter-T; //具体+T -T我一时不清楚,自己试试看
return M;
}

void main()
{
CPoint O1(189,160);
CPoint A(278,29);
double R=83;
double r=110;
CPoint M=CalcQieDian(O1,A,R,r);
cout<<M.x <<' '<<M.y;
}

void main()
{
CPoint O1(189,160);
CPoint A(278,29);
double R=83;
CPoint M=CalcQieDian(O1,POPOST http://zhidao.baidu.com/q HTTP/1.0
Prox.0
Prox27<<M.y;
}

}

(x-a)*(m-x)+(y-b)*(n-y)=0 是切线与切点和圆心的连线垂直,根据垂直的性质来列方程!
(x-a)的平方+(y-b)的平方=r的平方 切点到圆心的距离等于半径!!

你的题目少一个条件,就是切园的半径,否则应该是一个园系,要求的
切点应该是无穷多的。
CPoint CalcQieDian(CPoint ptCenter, CPoint ptOutside, double dbRadious, double dbradious)
{
//1.用海伦公式求三角形面积,
//定于ptCenter为三角形ABC的B顶点,ptOutside为C顶点,A为切园圆心, 切点M
double S,s; /*S:三角形面积 s=(a+b+c)/2 */
CSize T=ptOutside-ptCenter;
double a,b,c;
a=sqrt(T.cx*T.cx +T.cy*T.cy);
b=dbRadious;
c=dbRadious+dbradious;
s=(a+b+c)/2;
S=sqrt(s*(s-a)*(s-b)*(s-c));

//2.又S=a*c*sin(B)/2, 求角度B
double sinB=S*2/a/c;
double B=asin(sinB);

//3.求BC线段的角度, tan(alpha)=T.y/T.x
double alpha=atan(T.cy/T.cx);

//4.得到经过切点M的线段AB的角度beta
double beta=alpha-B; /*要得到另外一个切点,则alpha+B */

//5.计算相对于ptCenter的点M的偏移量
T.cx= long(dbRadious*sin(beta));
T.cy= long(dbRadious*cos(beta));

//6.计算最后结果
CPoint M=ptCenter-T; //具体+T -T我一时不清楚,自己试试看
return M;
}

void main()
{
CPoint O1(189,160);
CPoint A(278,29);
double R=83;
double r=110;
CPoint M=CalcQieDian(O1,A,R,r);
cout<<M.x <<' '<<M.y;
}

你的题目少一个条件,就是切园的半径,否则应该是一个园系,要求的
切点应该是无穷多的。
CPoint CalcQieDian(CPoint ptCenter, CPoint ptOutside, double dbRadious, double dbradious)
{
//1.用海伦公式求三角形面积,
//定于ptCenter为三角形ABC的B顶点,ptOutside为C顶点,A为切园圆心, 切点M
double S,s; /*S:三角形面积 s=(a+b+c)/2 */
CSize T=ptOutside-ptCenter;
double a,b,c;
a=sqrt(T.cx*T.cx +T.cy*T.cy);
b=dbRadious;
c=dbRadious+dbradious;
s=(a+b+c)/2;
S=sqrt(s*(s-a)*(s-b)*(s-c));

//2.又S=a*c*sin(B)/2, 求角度B
double sinB=S*2/a/c;
double B=asin(sinB);

//3.求BC线段的角度, tan(alpha)=T.y/T.x
double alpha=atan(T.cy/T.cx);

//4.得到经过切点M的线段AB的角度beta
double beta=alpha-B; /*要得到另外一个切点,则alpha+B */

//5.计算相对于ptCenter的点M的偏移量
T.cx= long(dbRadious*sin(beta));
T.cy= long(dbRadious*cos(beta));

//6.计算最后结果
CPoint M=ptCenter-T; //具体+T -T我一时不清楚,自己试试看
return M;
}

void main()
{
CPoint O1(189,160);
CPoint A(278,29);
double R=83;
double r=110;
CPoint M=CalcQieDian(O1,A,R,r);
cout<<M.x <<' '<<M.y;
}
(x-a)*(m-x)+(y-b)*(n-y)=0 是切线与切点和圆心的连线垂直,根据垂直的性质来列方程!
(x-a)的平方+(y-b)的平方=r的平方 切点到圆心的距离等于半径!!

(x-a)*(m-x)+(y-b)*(n-y)=0 是切线与切点和圆心的连线垂直,根据垂直的性质来列方程!
(x-a)的平方+(y-b)的平方=r的平方 切点到圆心的距离等于半径!!

(x-a)*(m-x)+(y-b)*(n-y)=0 是切线与切点和圆心的连线垂直,根据垂直的性质来列方程!
(x-a)的平方+(y-b)的平方=r的平方 切点到圆心的距离等于半径!!