社区
数据结构与算法
帖子详情
求两圆共切线的算法
clethe
2005-05-23 05:13:03
已知两圆相离,求其内公切线方程。
小弟谢了先。
...全文
841
9
打赏
收藏
求两圆共切线的算法
已知两圆相离,求其内公切线方程。 小弟谢了先。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ihsgnep
2005-07-03
打赏
举报
回复
Mark
cosio
2005-06-30
打赏
举报
回复
先判断圆心的距离,在确定它的切线!初中的题目!
mathe
2005-05-27
打赏
举报
回复
假设圆心坐标分别为(x1,y1),(x2,y2),半径分别为r1,r2
假设切线方程为ax+by+c=0
那么
a*x1+b*y1+c=r1*sqrt(a^2+b^2) (1)
a*x2+b*y2+c=-r2*sqrt(a^2+b^2) (2)
这个可以求出一条内公切线方程(也就是两个点到直线距离分别为r1,r2,分布再两旁)
另外一组方程是
a*x1+b*y1+c=-r1*sqrt(a^2+b^2)
a*x2+b*y2+c=r2*sqrt(a^2+b^2)
比如解方程组(1),(2),我们可以(1)-(2),消去c,然后记cos(s)=a/sqrt(a^2+b^2),sin(s)=b/sqrt(a^2+b^2)
得到
(x1-x2)cos(s)+(y1-y2)sin(s)=r1+r2
Let u=sqrt( (x1-x2)^2+(y1-y2)^2 ),
cos(t)=(x1-x2)/u, sin(t)=(y1-y2)/u,我们可以先计算出t
所以cos(t)cos(s)+sin(t)sin(s)=(r1+r2)/u
cos(t-s)=(r1+r2)/u
通过这个方法,我们可以解出s
tuxw
2005-05-25
打赏
举报
回复
上下切线,内外切线的规定为:
以圆心1指向圆2的向量为准,与该向量交叉的为内切线、不相交的为外切线
与向量夹角(逆时针为正)在90°以内为上切线,-90°以内为下切线
tuxw
2005-05-25
打赏
举报
回复
/*
* 功能:两下圆的切线
* 参数:
* x1, y1 --- 圆心1坐标
* x2, y2 --- 圆心2坐标
* r1, r2 --- 两个圆的半径
* type --- 切线类型(两个圆共有四条切线)
*/
#define sq2(x) (x)*(x)
#define PI 3.14159265358979323846
void tline(int x1,int y1,int x2,int y2,int r1,int r2,char type)
{ / * 0 is up-out... 1 is up-in... 2 is down-out.. 3 is down-in.. * /
/ * 0 表示上切线并且是外切线,其它类推* /
float a1; // 连心线与X轴夹角
float a2; // 公切线与连心线夹角
float k, distance=0; // 切点-圆心角度、圆心距
int dx11,dy11,dx22,dy22; // 待求切点坐标
int temp;
if((type < 0) || (type > 3))
return;
// 规定一个标准方向,将左边的圆定为圆1
// 使后面的夹角符号参考统一
if(x1 > x2) {
temp=x1,x1=x2,x2=temp;
temp=y1,y1=y2,y2=temp;
temp=r1,r1=r2,r2=temp;
}
// 计算圆心距与连心线角度
if(x1 == x2) {
distance = abs(y2-y1);
if(y1 > y2)
a1=PI/2;
else
a1=-PI/2;
}
else
a1=atan((float)(y1-y2)/(x2-x1));
if(y1 == y2)
distance=abs(x2-x1);
if(distance <= 0.0)
distance=sqrt((long)sq2(y2-y1)+(long)sq2(x2-x1));
// 公切线与连心线夹角
if(type % 2 == 0)
a2=asin((float)(r2-r1)/distance);
else
a2=asin((float)(r2+r1)/distance);
// 四条切线的不同由两个平夹角不同组合组成
// 组成的角度 k 为圆心与切点的连线与X轴的夹角
switch(type)
{
case 0:
k=a1+a2;
dx11=x1-r1*sin(k);dy11=y1-r1*cos(k);
dx22=x2-r2*sin(k);dy22=y2-r2*cos(k);
break;
case 2:
k=a1-a2;
dx11=x1+r1*sin(k);dy11=y1+r1*cos(k);
dx22=x2+r2*sin(k);dy22=y2+r2*cos(k);
break;
case 1:
k=a1-a2;
dx11=x1-r1*sin(k);dy11=y1-r1*cos(k);
dx22=x2+r2*sin(k);dy22=y2+r2*cos(k);
break;
case 3:
k=a1+a2;
dx11=x1+r1*sin(k);dy11=y1+r1*cos(k);
dx22=x2-r2*sin(k);dy22=y2-r2*cos(k);
break;
default:
break;
}
myline(dx11,dy11,dx22,dy22); // 直线
}
void myline(int x1, int y1, int x2, int y2)
{
//不同环境下的直函数函数
line(x1, y1, x2, y2); // TC
}
在TC下的测试代码
#include <conio.h>
#include <graphics.h>
#include <math.h>
#define sq2(x) (x)*(x)
#define PI 3.14159265358979323846
void tline(int x1,int y1,int x2,int y2,int r1,int r2,char type);
void main()
{
int x1 = 150, y1 = 120, r1 = 40;
int x2 = 400, y2 = 280, r2 = 60;
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
circle(x1, y1, r1);
circle(x2, y2, r2);
tline(x1, y1, x2, y2, r1, r2, 0);
tline(x1, y1, x2, y2, r1, r2, 1);
tline(x1, y1, x2, y2, r1, r2, 2);
tline(x1, y1, x2, y2, r1, r2, 3);
getch();
closegraph();
}
寻开心
2005-05-23
打赏
举报
回复
有了交点和斜率,自然就知道了内切线的方程了
需要注意的是出于算法安全性的考虑,应该先计算两个圆心之间的距离L是否大于两个圆半径的和r1+r2,否则计算结果无效的
寻开心
2005-05-23
打赏
举报
回复
知道了Q点的坐标,就还可以知道圆心连线和内切线之间的夹角
因为他们的正弦数值就是 r1/x = r2/(L-x)
使用atan2函数可以计算出来,圆心连线的直线斜率
根据atan2(r1, r2*L/(r1+r2) = atan2( r1+r2, L )
就可以计算夹角相差多大了
注意可正可负,没有区别的,因为内切线是两条
寻开心
2005-05-23
打赏
举报
回复
我们做一个图,
两个圆,各自的半径分别是r1,r2,圆心O1,O2
两个圆心之间的距离是L
对于所求的一个内切线来说,和两个圆的交点非别是P1,P2
假定P1P2的连线和两个圆心的连线O1O2相交于Q点
假定,Q点到O1的距离长度为x
根据三角形的相似定理,显然有
r1/r2 = x/ (L-x)
从而可用推导出
x = r1*L/(r1+r2)
知道了这个点Q,那么显然内切点很容易就算出来了
jp1984
2005-05-23
打赏
举报
回复
对两方程分别求导得到各自圆周上切线方程,联立两方程可求切点。讲切点代入前面所求任一切线的方程,即为所求
matlab
求
解圆公
切线
方程 程序.doc
在MATLAB中
求
解
两圆
公
切线
方程是一个涉及几何和代数的数学问题。题目提供的程序旨在解决这个问题,但存在一些已知的bug,特别是在处理特定角度的外公
切线
时。以下是对该程序及其相关知识点的详细解释: 首先,程序...
绘制圆的外部/内部公
切线
:获取并绘制圆的外部/内部公
切线
-matlab开发
在MATLAB中,绘制圆的外部或内部公
切线
是一个涉及几何和
算法
的问题。这篇文章将深入探讨如何通过编程实现这个功能。首先,我们需要理解公
切线
的概念:如果两条直线分别与两个圆仅在一个点相切,那么这两条直线就是这...
(源码)基于C++编程语言的计算几何模板库.zip
圆包含圆与直线交点计算、
两圆
交点计算、点到圆的
切线
计算、
两圆
公
切线
计算,以及
两圆
相交面积计算。 随机
算法
提供模拟退火
算法
。 ## 安装使用步骤 1. 下载源码用户已下载本项目的源码文件。 2. 包含头文件在...
2007robocon 路径规划 子函数
本话题主要关注路径规划中的一个子函数,该子函数处理了直线与圆的几何关系,具体包括
求
两直线与圆的公
切线
交点、判断线段与圆是否相交以及找到距离圆心两个固定距离的点。这些知识在机器人路径规划中至关重要,因为...
基于Dijkstra
算法
的足球机器人的一种路径规划方法
文中提供了一种方法:首先确定机器人的运动方向,然后根据这个方向构造一条与机器人和障碍物都相切的线,即所谓的“公
切线
”。通过这条公
切线
,可以进一步确定机器人绕过障碍物时的路径,并找到最佳的中间点位置。 ...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章