如何求两个圆的交点,求算法,有代码更好.非常感谢,再次谢谢.

liquanle 2004-12-29 02:04:09
求一个算法。
已知:两个圆,圆A和圆B,圆A的半径和圆心为r1和(a1,b1), 圆B的半径和圆心为r2和(a2,b2).
求这两个圆的交点(可能有一个,也可能有两个,也可能没有,可以只考虑一个一般的算法就行)。
给出算法,能给出代码更好。非常感谢。

解决立即结贴,分不够可再加.
...全文
3997 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
redlqs 2004-12-29
  • 打赏
  • 举报
回复
1 列方程
2 求解
3 输出
寻开心 2004-12-29
  • 打赏
  • 举报
回复
主要是考虑相交两点的时候的计算方法,没有仔细去想那些特殊情况
包含的关系是发生在 l<r1 || l<r2的情形下
应该补充进去才完整。


交点连线被原点连线垂直平分的,是一回事
Y是交点到D的距离,也是两个交点之间距离的一半
双杯献酒 2004-12-29
  • 打赏
  • 举报
回复
不是求方程组的解吗?
四次方程是有公式的。
fflush 2004-12-29
  • 打赏
  • 举报
回复
完全的一个解析几何的问题,直接解方程,然后写出表达式,然后用程序计算这个表达式的值就好了:)
goodluckyxl 2004-12-29
  • 打赏
  • 举报
回复
圆包含的情况不要漏掉
你说的情况好象是 水平情况Y应该是交点到D的长度
而不是坐标吧
寻开心 2004-12-29
  • 打赏
  • 举报
回复
这类问题,去专题开发栏目,算法和数据结构里面,哪里做这个的人多点
寻开心 2004-12-29
  • 打赏
  • 举报
回复
1 计算两个圆心之间的距离L
2 如果 L>r1+r2 无交点
3 如果 l = r1 + r2 则一个交点, 用圆心的坐标可以计算出具体点
4 假定 两个交点的连线和圆心连线的交点是D,D到第一个圆心的距离是d, 则
d*d + y*y = r1*r1
(l-d)*(l-d) + y*y = r2 * r2
其中y就是两交点连线距离的一半了
合并一下可得到:
r2*r2 - r1*r1 = l*l - 2dl
d = (l*l - r2*r2 + r1*41) / 2l
5 根据前面的公式,还可以确定出来 y的数值
两个交点,则可求了

这个算法不必解二元二次的方程组,直观简单
goodluckyxl 2004-12-29
  • 打赏
  • 举报
回复
汗 那你不给出精度 迭代是没有意义就算给你大步长也不行

我真的一直不知道有计算机有其他方法 二次方程求解[]

等待 wwxsoft(婉儿) 的算法
liquanle 2004-12-29
  • 打赏
  • 举报
回复
取步长迭代,我用的是double 型,恐怕就不太好说了吧.

而且这样效率太低.

婉儿, 如何解出两个方程的解呀.
我感觉太难解了.
goodluckyxl 2004-12-29
  • 打赏
  • 举报
回复
判断交点个数是很简单的
1.求两个圆心之间距离 L, if( L == ( r1 + r2 )|| L == |r1-r2| ) 一个交点
L > r1+r2 || L < |r1-r2| 则无交点
L >|r1-r2| && L < r1+r2 则有两个交点
2.至于求点 有圆心和半径得出迭代区间,取步长进行迭代得出交点坐标
dudu妈 2004-12-29
  • 打赏
  • 举报
回复
if(sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2))>(r1+r2))则这两个圆没有交点。
if(sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2))<(r1+r2))则这两个圆有两个交点。
if(sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2))=(r1+r2))则这两个圆有一个交点。
圆A的方程为:(x-a1)*(x-a1)+(y-b1)*(y-b1)=r1;
圆B的方程为:(x-a2)*(x-a2)+(y-b2)*(y-b2)=r2;
两个圆的交点为圆A方程和圆B方程的解:
(x-a1)*(x-a1)+(y-b1)*(y-b1)=r1;
(x-a2)*(x-a2)+(y-b2)*(y-b2)=r2;
上面两个方程联合求解,解出x和y,就是两个圆的交点。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧