c#(WinForm)绘制两个圆的内公切线
一图胜千言
基础知识,三角函数,反三角函数,点绕点旋转,可以看到斜率为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)绘制两个圆的内公切线相关推荐
- Visio中绘制两个圆的重叠部分
文件-选项-高级-常规-开发人员模式,勾选后会多出一个开发工具标签,"操作"里面有图像的组合.拆分.合并之类的,合并便可出现两个圆的重叠区域.
- 用MATLAB绘制两个圆相切,教您用几何绘图工具画三个两两相切的圆
圆与圆的位置关系有:相离,外切,相交,内切,内含,它们之间的位置是由圆心距与两半径的长度来确定的.那么如果想画出三个两两相切的圆,要怎样画呢?这时我们可以利用几何画板这个绘图工具,画出既标准又美观的图 ...
- 人脸特征提取(在眼睛处绘制黑色实心圆)
以人脸识别(属于分类问题)为例,理解实际应用中的特征数据集提取. 1)用python3 + opencv3.4 + dlib库编程,打开摄像头,实时采集人脸并保存.绘制68个特征点: 2)不在原视频上 ...
- WinForm绘制直线、曲线、矩形、椭圆、圆弧
WinForm绘制直线.曲线.矩形.椭圆.圆弧 新建一个窗体.添加六个按钮,插入下面的代码.得到上图. private void button1_Click(object sender, EventA ...
- python两个同切圆_求两个圆的交点
我试图在Python中找到两个圆之间的交集(使用Matplotlib),但是找不到任何值.在 为此,我为每个单独的圆创建X和Y的列表(Matplotlib在绘制圆时将第一个参数作为X值,第二个参数作为 ...
- Android开发(1):随机绘制彩色实心圆
本文介绍了如何利用Android的绘图技术随机绘制彩色实心圆.效果如图1所示. 图1 这个程序的核心是画布,也就是Canvas对象.要想在Canvas上绘制 ...
- java求圆弧切线_两个圆的公切线
两个圆的公切线 圆上任意一点拥有唯一的圆心角 struct circle{ Point p; double r; // 通过圆心角求圆上某一点 Point point(double a){ retur ...
- Unity3D绘制两圆柱体相贯线
1 相贯线 项目中需要用代码去绘制两个圆柱体相贯线,花了两天时间可算整明白怎么画了.国内有关这方面的文章不多,所以花了很多时间,我这里总结一下,如果能够帮助到需要的同学,也算善莫大焉. 相贯线 ...
- OpenLayers 6 代码绘制/draw交互组件绘制两种方式绘制椭圆过程详解
引言 OpenLayers可以通过代码绘制多种几何形状,也可以通过draw类型的交互组件绘制几何形状,官方实例提供了类如圆.折线.矩形.星形等方法.除此之外,椭圆这种图形其实也是非常常见的几何图形,但 ...
- fft的c语言和matlab对比_Matlab在绘制两相互垂直斜锯齿振动与简谐振动合成运动轨迹图形的应用...
1 提出问题 在振动学中,相互垂直的两简谐振动合成时,如果两简谐振动的频率相同,则可形成稳定的椭圆曲线,极端条件为圆和直线:而当两相互垂直的简谐振动频率不同时,合成运动比较复杂,其运动轨迹一般不闭合, ...
最新文章
- oracle多表查询
- 对使用Jolt调用Tuxedo的一个简单的封装
- CSP认证201512-4	送货[C++题解]:无向图欧拉路径、并查集、dfs
- 云炬创业政策学习笔记20210104
- 关于堆的判断 (25 分)
- 四、纤维素纤维使用P-N系阻燃剂协同作用的原理?
- Spring MVC中使用 Swagger2 构建Restful API
- 信息学奥赛一本通C++语言——1063:最大跨度值
- fatal: could not read Username for 'https://github.com': No such file or directory
- mysql主从复制服务器配置
- Macbook下ffmpeg下载失败问题解决
- 使用正交表高效地设计测试用例
- 平均值、中位数、众数等统计特性的matlab求解与示例
- 51单片机 Proteus仿真 身高体重测量 HX711 超声波SR-04
- Elasticsearch——Keyword字段类型
- 读书笔记——《一个人的朝圣》
- [Irving]SqlServer 拆分函数用法
- 浏览器主页被劫持篡改了怎么办
- 网易2019实习生招聘编程题之数对
- (2017多校训练第四场)HDU - 6078 Wavel Sequence dp
热门文章
- 关于react、vue的一些问题
- sqoop导数到各个数据库,可以套用
- 插画师如何确定自己的风格?教你如何一步步找到自己绘画风格!
- 【Android Tricks 6】ViewPager首页与尾页的滑动动作响应
- 姿态估计1-02:FSA-Net(头部姿态估算)-源码训练测试-报错解决
- 制作mac系统引导盘
- 设置chrome浏览器在一个标签页中打开链接自动跳转到新标签页
- 手机显示DNS服务器异常,手机dns服务器异常怎么设置
- TransTrack: Multiple-Object Tracking with Transformer
- VUE项目 格林威治时间转换为北京时间