C++ 实现求两圆外公切线

时间: 2023-07-11 13:37:04 浏览: 42
下面是一个简单的 C++ 实现,可以求解两个圆的外公切线。其中,Circle 类表示圆,包含圆心坐标和半径信息,Line 类表示直线,包含直线上的两个点的坐标信息。 ``` #include <iostream> #include <cmath> using namespace std; const double eps = 1e-8; struct Point { double x, y; Point() {} Point(double x, double y) : x(x), y(y) {} }; struct Circle { Point c; double r; Circle() {} Circle(Point c, double r) : c(c), r(r) {} }; struct Line { Point p1, p2; Line() {} Line(Point p1, Point p2) : p1(p1), p2(p2) {} }; double dis(Point A, Point B) { return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)); } int dcmp(double x) { if (fabs(x) < eps) return 0; return x < 0 ? -1 : 1; } Point getIntersection(Line a, Line b) { double x1 = a.p1.x, y1 = a.p1.y; double x2 = a.p2.x, y2 = a.p2.y; double x3 = b.p1.x, y3 = b.p1.y; double x4 = b.p2.x, y4 = b.p2.y; double k1 = (y2 - y1) / (x2 - x1); double k2 = (y4 - y3) / (x4 - x3); double b1 = y1 - k1 * x1; double b2 = y3 - k2 * x3; double x = (b2 - b1) / (k1 - k2); double y = k1 * x + b1; return Point(x, y); } void getOuterTangents(Circle A, Circle B, Line &l1, Line &l2) { double d = dis(A.c, B.c); double cosA = (A.r - B.r) / d; double sinA = sqrt(1 - cosA * cosA); Point v = (B.c - A.c) / d; Point p1 = A.c + v * (A.r / cosA); Point p2 = B.c - v * (B.r / cosA); Point p3 = A.c + v * (A.r / cosA * cosA * sinA); Point p4 = B.c - v * (B.r / cosA * cosA * sinA); l1 = Line(p1, p2); l2 = Line(p3, p4); } int main() { Circle A(Point(0, 0), 2); Circle B(Point(3, 0), 1); Line l1, l2; getOuterTangents(A, B, l1, l2); cout << "Outer tangents: " << endl; cout << "(" << l1.p1.x << ", " << l1.p1.y << ") -> (" << l1.p2.x << ", " << l1.p2.y << ")" << endl; cout << "(" << l2.p1.x << ", " << l2.p1.y << ") -> (" << l2.p2.x << ", " << l2.p2.y << ")" << endl; return 0; } ``` 这个例子中,我们假设两个圆的圆心分别为 (0, 0) 和 (3, 0),半径分别为 2 和 1。程序输出了两个圆的外公切线的坐标。在实际使用中,可以根据需要进行修改。

相关推荐

最新推荐

recommend-type

C++实现两个有序数组的合并

主要为大家详细介绍了C++实现两个有序数组的合并,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

opencv3/C++实现霍夫圆/直线检测

今天小编就为大家分享一篇opencv3/C++实现霍夫圆/直线检测,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

C++中求组合数的各种方法总结详解

本篇文章是对C++中的求组合数的各种方法进行了详细的介绍。需要的朋友参考下
recommend-type

C++实现新年贺卡程序

主要为大家详细介绍了C++实现贺卡程序,C++应用程序编写的雪花贺卡,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

基于C++实现读取指定路径文件

主要介绍了基于C++实现读取指定路径文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。