两个圆的公切线

圆上任意一点拥有唯一的圆心角

struct circle{

Point p;

double r;

// 通过圆心角求圆上某一点

Point point(double a){

return Point(p.x + cos(a) * r, c.y + sin(a) * r);

}

}

根据两个圆的位置关系来确定情况

两个圆内含,没有公共点,没有公切线

两圆内切,有一个条公切线

两圆完全重合,有无数条公切线

两圆相交。有2条公切线

两圆外切,有3条公切线

两圆相离,有4条公切线

1 与 3 什么都不求,情况 2 可以直接求出直线AB的极角进而转换为圆心角来求切点,连接切点和圆心,旋转90度即可得到切线。

情况 4 有两条外公切线,求出圆心距 \(d\) 以及\(|AG|\) 即可求出 \(\alpha\) 的大小,根据 \(\vec{AB}\) 的极角进行旋转即可求出切点,进而得到切线

情况 5 的内切线类似情况2

情况 6 的外公切线与情况4完全一样

情况 6 的内切线也是先求出圆心角 \(\alpha\) ,如何求?\(\cos \alpha = \frac{A_r+B_r}{|AB|}\)

// a[i] 存放第 i 条公切线与 圆A 的交点

int getTangents(circle A, circle B, Point*a, Point *b){

int cnt = 0;

// 以A为半径更大的那个圆进行计算

if(A.r < B.r) return getTangents(B, A, b, a);

db d2 = (A.p-B.p).len2(); // 圆心距平方

db rdiff = A.r - B.r;// 半径差

db rsum = A.r + B.r;//半径和

if(d2 < rdiff * rdiff) return 0; // 情况1,内含,没有公切线

Vector AB = B.p - A.p;// 向量AB,其模对应圆心距

db base = atan2(AB.y, AB.x);// 求出向量AB对应的极角

if(d2 == 0 && A.r == B.r) return -1;// 情况3,两个圆重合,无限多切线

if(d2 == rdiff * rdiff){ // 情况2,内切,有一条公切线

a[cnt] = A.point(base);

b[cnt] = B.point(base);cnt++;

return 1;

}

// 求外公切线

db ang = acos((A.r - B.r) / sqrt(d2)); //求阿尔法

// 两条外公切线

a[cnt] = A.point(base+ang); b[cnt] = B.point(base+ang); cnt++;

a[cnt] = A.point(base-ang); b[cnt] = B.point(base-ang); cnt++;

if(d2 == rsum * rsum){ // 情况5,外切,if里面求出内公切线

a[cnt] = A.point(base); b[cnt] = B.point(pi+base); cnt++;

}

else if(d2 > rsum * rsum){//情况6,相离,再求出内公切线

db ang = acos((A.r + B.r) / sqrt(d2));

a[cnt] = A.point(base + ang); b[cnt] = B.point(pi+base+ang);cnt++;

a[cnt] = A.point(base - ang); b[cnt] = B.point(pi+base-ang);cnt++;

}

// 此时,d2 < rsum * rsum 代表情况 4 只有两条外公切线

return cnt;

}

来源:oschina

链接:https://my.oschina.net/u/4391429/blog/4254697

两个圆公切线求法_两个圆的公切线相关推荐

  1. 两个圆公切线求法_两圆的公切线教案

    两圆的公切线教案 第一课时 两圆的公切线(一) 教学目标: (1)理解两圆相切长等有关概念,掌握两圆外公切线长的求法: (2)培养学生的归纳.总结能力: (3)通过两圆外公切线长的求法向学生渗透&qu ...

  2. 两个圆公切线求法_求两圆的公切线计算

    关于两圆的公切线计算我们首先需要搞清楚的是两个圆之间有哪些位置关系,两个圆的位置包括内含.内切.外切.外离几种方式,可以看出位置关系可以根据"两圆心之间的距离"与"两圆半 ...

  3. ios开发 方形到圆的动画_画个圆动画,的两种实现。iOS 动画由很浅,入浅,当然是 Swift...

    方法一,使用 CAShapeLayer 和 UIBezierPath 加上 CABasicAnimation 有一个动画属性 strokeEnd 就算完 方法二,复杂一些.频繁调用 CALayer 的 ...

  4. 比较两个表格的不同_两表数据的核对,WPS表格似乎更加方便容易

    在EXCEL中的两个表格的数据对比,可能使用的方法会采用到查询语句,VBA之类的.显得在使用的过程显得有些复杂.在不经间发现WPS表格的功能处理此类的问题显得就比较的简单的多. 查看并标识出分数相同的 ...

  5. java两个长度不同数组_两组数组,长度不一样,如果其中一个数组的值在另一个中不存在,则不符合要求.怎么算?...

    思路一 先找到最长的数组,然后循环短的数组并判断元素是否在长数组中 public class Main { public static void main(String[] args) throws ...

  6. matlab两张图片合成一张_两张图片合成一幅画意作品的简单方法

    在<教你制作一幅画意摄影作品>的文章中,介绍了Snapseed(指划修图)和ToolWiz Photos(理理相册)两个App中用手机或平板制作画意摄影作品的基本方法,现在再来进一步试试用 ...

  7. 两个相同矩形脉冲卷积_两个矩形脉冲的卷积

    我试图找到两个矩形脉冲的卷积.在 没有错误被抛出-我得到了一个适当形状的波形输出-然而,我的答案的大小似乎太大了,我也不确定如何将正确的x/时间轴与这个卷积相匹配.在 此外,卷积的大小似乎取决于两个脉 ...

  8. 两个网段共享打印机_两个网段打印机共享

    方案 1 1 .把第二个路由器( 192.168.1.1 )设置成交换机,此路由下的电脑就可以和你 192.168.0.1 路由在同一个网络里了.同样可以共享第一个路由下的打印机了. 操作方法: 登陆 ...

  9. 一张图片放两个二维码_两个方法教你找到一张图片的高清版

    有时候,看到一张图片,很想要找到它的出处,或者是自己很喜欢,想要保存下来,可惜图片尺寸太小,不适合收藏,怎么办呢?喵叔有两个小办法~ 第三方网站无损放大 推荐一个网站 bigjpg.com 可以在线无 ...

最新文章

  1. 关于 MySQL LEFT JOIN 你可能需要了解的三点
  2. 数据结构Stack:关系以及方法
  3. UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径
  4. Oracle之例外(异常)
  5. 官方科普iQOO 5 120W闪充方案:首发6C高倍率电芯 15分钟充入100%
  6. Oracle修改globalname,oracle修改global_name和service_name
  7. 1000行代码入门python-Python基础知识和工作环境
  8. 【重点】剑指offer——面试题27:二叉搜索树与双向链表
  9. 触发器及其应用实验报告总结_2020年中考总复习: 光现象、透镜及其应用知识点总结...
  10. 快压软件的彻底删除方法
  11. 计算机测试代码怎么写,常见的电脑检测卡代码对照表大全
  12. 如何取消计算机限制连接,怎样解除网络连接限制?
  13. 易观CTO郭炜:开源,不是天才的甜点,而是勤奋者的盛宴
  14. 重装系统后无法连接到网络?
  15. ae合成设置快捷键_(精品)AE从小白到大神之路(一)-AE入门
  16. js Deferred的使用
  17. Python—基于Flask框架调用百度接口实现语音识别功能
  18. win10安装Andorid Studio常见问题
  19. d3ForceEasy —— 一个封装D3js force力导向图 简单使用的轮子
  20. git cherry-pick 同步修改到另一个分支

热门文章

  1. yolov5制作docker镜像并在容器中使用
  2. mysql rr和rc_MySQL的在RC和RR模式下的锁
  3. Unix/Linux编程:接口层---以太网
  4. 邮件群发平台哪个效果好?怎么群发邮件?什么邮箱能群发邮件?
  5. zip压缩包密码恢复?
  6. Excel文档加密网络授权管理方案 - 加密Excel文档并通过服务器端授权管理
  7. matlab 如何画ladder图,4.1.1 梯形图(Ladder Diagram)程序设计语言
  8. IC Insights:2020年全球物联网芯片市场将超过310亿美元
  9. 解密Facebook产品的开发流程
  10. GBK 编码不兼容问题