一图胜千言

基础知识,三角函数,反三角函数,点绕点旋转,可以看到斜率为0的情况也是进行了处理的,在运动中也没有任何BUG。当然我会放上一张图帮助大家理解。

核心代码

 /// <summary>/// 计算两个相离的圆的内公切线。(相交没有内公切线,只有外公切线)/// 圆C1, 圆心(a, b), 半径r1./// 圆C2, 圆心(c, d), 半径r2./// </summary>/// <returns>返回两条内公切线段,线段的两个端点是圆上的切点。</returns>PointF r2_low_point = new PointF();PointF r2_up_point = new PointF();PointF r1_up_point = new PointF();PointF r1_low_point = new PointF();public void getTangentPoint(double a, double b, double r1, double c, double d, double r2){double α =Math.Atan2((b - d) , (a - c));    //求中两个圆心连线的斜率角度double centerLine;if (d == b)                            //处理斜率为零的情况       {if (a < c){centerLine = a - c;}else{centerLine = c-a;}}else{centerLine = (d - b) / Math.Sin(α); //求两个圆心连线长度}double β = Math.Acos((r1 + r2) / centerLine);  //求两个圆心连线和圆心到切点垂线的夹角double θ = β - α;                              double r2LowX = r2 * Math.Cos(θ);double r2LowY = r2 * Math.Sin(θ);double r1UpX = r1 * Math.Cos(θ);double r1UpY = r1 * Math.Sin(θ);r2_low_point.X = centerOfCircle2.X - (float)r2LowX;r2_low_point.Y = centerOfCircle2.Y + (float)r2LowY;r1_up_point.X = centerOfCircle1.X + (float)r1UpX;r1_up_point.Y = centerOfCircle1.Y - (float)r1UpY;PointF r2_tempoint= Transition( r2_low_point.X- centerOfCircle2.X, r2_low_point.Y-centerOfCircle2.Y, 2 * β, 1);r2_up_point.X = centerOfCircle2.X + r2_tempoint.X;r2_up_point.Y = centerOfCircle2.Y + r2_tempoint.Y;PointF r1_tempoint = Transition(r1_up_point.X - centerOfCircle1.X, r1_up_point.Y-centerOfCircle1.Y, 2 * β, 1);r1_low_point.X = centerOfCircle1.X + r1_tempoint.X;r1_low_point.Y = centerOfCircle1.Y + r1_tempoint.Y;}//点绕点旋转private PointF Transition(float _x, float _y, double _angle, int fx){double newX = 0;double newY = 0;if (fx == 1){newX = _x * Math.Cos(_angle) - _y * Math.Sin(_angle);newY = _x * Math.Sin(_angle) + _y * Math.Cos(_angle);}else{newX = _x * Math.Cos(_angle) + _y * Math.Sin(_angle);newY = _y * Math.Cos(_angle) - _x * Math.Sin(_angle);}return new PointF((float)newX, (float)newY); }

c#(WinForm)绘制两个圆的内公切线相关推荐

  1. Visio中绘制两个圆的重叠部分

    文件-选项-高级-常规-开发人员模式,勾选后会多出一个开发工具标签,"操作"里面有图像的组合.拆分.合并之类的,合并便可出现两个圆的重叠区域.

  2. 用MATLAB绘制两个圆相切,教您用几何绘图工具画三个两两相切的圆

    圆与圆的位置关系有:相离,外切,相交,内切,内含,它们之间的位置是由圆心距与两半径的长度来确定的.那么如果想画出三个两两相切的圆,要怎样画呢?这时我们可以利用几何画板这个绘图工具,画出既标准又美观的图 ...

  3. 人脸特征提取(在眼睛处绘制黑色实心圆)

    以人脸识别(属于分类问题)为例,理解实际应用中的特征数据集提取. 1)用python3 + opencv3.4 + dlib库编程,打开摄像头,实时采集人脸并保存.绘制68个特征点: 2)不在原视频上 ...

  4. WinForm绘制直线、曲线、矩形、椭圆、圆弧

    WinForm绘制直线.曲线.矩形.椭圆.圆弧 新建一个窗体.添加六个按钮,插入下面的代码.得到上图. private void button1_Click(object sender, EventA ...

  5. python两个同切圆_求两个圆的交点

    我试图在Python中找到两个圆之间的交集(使用Matplotlib),但是找不到任何值.在 为此,我为每个单独的圆创建X和Y的列表(Matplotlib在绘制圆时将第一个参数作为X值,第二个参数作为 ...

  6. Android开发(1):随机绘制彩色实心圆

    本文介绍了如何利用Android的绘图技术随机绘制彩色实心圆.效果如图1所示.                       图1 这个程序的核心是画布,也就是Canvas对象.要想在Canvas上绘制 ...

  7. java求圆弧切线_两个圆的公切线

    两个圆的公切线 圆上任意一点拥有唯一的圆心角 struct circle{ Point p; double r; // 通过圆心角求圆上某一点 Point point(double a){ retur ...

  8. Unity3D绘制两圆柱体相贯线

    1 相贯线   项目中需要用代码去绘制两个圆柱体相贯线,花了两天时间可算整明白怎么画了.国内有关这方面的文章不多,所以花了很多时间,我这里总结一下,如果能够帮助到需要的同学,也算善莫大焉.   相贯线 ...

  9. OpenLayers 6 代码绘制/draw交互组件绘制两种方式绘制椭圆过程详解

    引言 OpenLayers可以通过代码绘制多种几何形状,也可以通过draw类型的交互组件绘制几何形状,官方实例提供了类如圆.折线.矩形.星形等方法.除此之外,椭圆这种图形其实也是非常常见的几何图形,但 ...

  10. fft的c语言和matlab对比_Matlab在绘制两相互垂直斜锯齿振动与简谐振动合成运动轨迹图形的应用...

    1 提出问题 在振动学中,相互垂直的两简谐振动合成时,如果两简谐振动的频率相同,则可形成稳定的椭圆曲线,极端条件为圆和直线:而当两相互垂直的简谐振动频率不同时,合成运动比较复杂,其运动轨迹一般不闭合, ...

最新文章

  1. oracle多表查询
  2. 对使用Jolt调用Tuxedo的一个简单的封装
  3. CSP认证201512-4 送货[C++题解]:无向图欧拉路径、并查集、dfs
  4. 云炬创业政策学习笔记20210104
  5. 关于堆的判断 (25 分)
  6. 四、纤维素纤维使用P-N系阻燃剂协同作用的原理?
  7. Spring MVC中使用 Swagger2 构建Restful API
  8. 信息学奥赛一本通C++语言——1063:最大跨度值
  9. fatal: could not read Username for 'https://github.com': No such file or directory
  10. mysql主从复制服务器配置
  11. Macbook下ffmpeg下载失败问题解决
  12. 使用正交表高效地设计测试用例
  13. 平均值、中位数、众数等统计特性的matlab求解与示例
  14. 51单片机 Proteus仿真 身高体重测量 HX711 超声波SR-04
  15. Elasticsearch——Keyword字段类型
  16. 读书笔记——《一个人的朝圣》
  17. [Irving]SqlServer 拆分函数用法
  18. 浏览器主页被劫持篡改了怎么办
  19. 网易2019实习生招聘编程题之数对
  20. (2017多校训练第四场)HDU - 6078 Wavel Sequence dp

热门文章

  1. 关于react、vue的一些问题
  2. sqoop导数到各个数据库,可以套用
  3. 插画师如何确定自己的风格?教你如何一步步找到自己绘画风格!
  4. 【Android Tricks 6】ViewPager首页与尾页的滑动动作响应
  5. 姿态估计1-02:FSA-Net(头部姿态估算)-源码训练测试-报错解决
  6. 制作mac系统引导盘
  7. 设置chrome浏览器在一个标签页中打开链接自动跳转到新标签页
  8. 手机显示DNS服务器异常,手机dns服务器异常怎么设置
  9. TransTrack: Multiple-Object Tracking with Transformer
  10. VUE项目 格林威治时间转换为北京时间