C++第13周(春)项目3 - 与圆心相连的直线

2024-03-03 09:18
文章标签 c++ 项目 13 直线 相连 圆心

本文主要是介绍C++第13周(春)项目3 - 与圆心相连的直线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接


【项目3 - 与圆心相连的直线】
  在项目1中定义的Point(点)类和Circle(圆)类基础上,设计一种方案,输出给定一点p与圆心相连成的直线与圆的两个交点。
  提示:

  

参考解答:

方案1:用引用类型参数获得结果

#include <iostream>
#include<Cmath>
using namespace std;
class Circle;  //由于在Point中声明友元函数crossover_point中参数中用了Circle,需要提前声明
class Point
{
public:Point(double a=0,double b=0):x(a),y(b) {}		//构造函数friend ostream & operator<<(ostream &,const Point &);//重载运算符“<<”friend void crossover_point(Point &p,Circle &c, Point &p1,Point &p2 ) ;  //求交点的友元函数
protected:										 //受保护成员double x,y;
};
ostream & operator<<(ostream &output,const Point &p)
{output<<"["<<p.x<<","<<p.y<<"]";return output;
}class Circle:public Point //circle是Point类的公用派生类
{
public:Circle(double a=0,double b=0,double r=0):Point(a,b),radius(r) { } //构造函数friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”friend void crossover_point(Point &p,Circle &c, Point &p1,Point &p2 ) ;  //求交点的友元函数
protected:double radius;
};//重载运算符“<<”,使之按规定的形式输出圆的信息
ostream &operator<<(ostream &output,const Circle &c)
{output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius;return output;
}//给定一点p,求出该点与圆c的圆心相连成的直线与圆的两个交点p1和p2
//关键问题是求得的交点如何返回
//方案1:利用引用类型的形式参数,注意,下面的p1和p2将“带回”求得的结果
//crossover_point函数已经声明为Point和Circle类的友元函数,类中私有成员可以直接访问
void crossover_point(Point &p, Circle &c, Point &p1,Point &p2 )
{p1.x = (c.x + sqrt(c.radius*c.radius/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));p2.x = (c.x - sqrt(c.radius*c.radius/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));p1.y = (p.y + (p1.x -p.x)*(c.y-p.y)/(c.x-p.x));p2.y = (p.y + (p2.x -p.x)*(c.y-p.y)/(c.x-p.x));
}int main( )
{Circle c1(3,2,4);Point p1(1,1),p2,p3;crossover_point(p1,c1, p2, p3);cout<<"点p1: "<<p1<<endl;cout<<"与圆c1: "<<c1<<endl;cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;cout<<"交点1: "<<p2<<endl;cout<<"交点2: "<<p3<<endl;return 0;
}

方案2:定义一个包含两个点的结构体,专门用于返回值(定义成类进行封装可能更好)

#include <iostream>
#include<Cmath>
using namespace std;
class Circle;  //由于在Point中声明友元函数crossover_point中参数中用了Circle,需要提前声明
struct DoublePoint;  //也先声明,Point中声明友元函数crossover_point中要用到
class Point
{
public:Point(double a=0,double b=0):x(a),y(b) {}		//构造函数friend ostream & operator<<(ostream &,const Point &);//重载运算符“<<”friend DoublePoint crossover_point(Point &p,Circle &c) ;  //求交点的友元函数
protected:										 //受保护成员double x,y;
};
ostream & operator<<(ostream &output,const Point &p)
{output<<"["<<p.x<<","<<p.y<<"]";return output;
}class Circle:public Point //circle是Point类的公用派生类
{
public:Circle(double a=0,double b=0,double r=0):Point(a,b),radius(r) { } //构造函数friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”friend DoublePoint crossover_point(Point &p,Circle &c) ;  //求交点的友元函数
protected:double radius;
};//重载运算符“<<”,使之按规定的形式输出圆的信息
ostream &operator<<(ostream &output,const Circle &c)
{output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius;return output;
}struct DoublePoint   //专门用于返回值的结构体类型
{Point p1;Point p2;
};//给定一点p,求出该点与圆c的圆心相连成的直线与圆的两个交点
//方案2:结果返回到DoublePoint类型的结构体中
//crossover_point函数已经声明为Point和Circle类的友元函数,类中私有成员可以直接访问
DoublePoint crossover_point(Point &p, Circle &c)
{DoublePoint pp;pp.p1.x = (c.x + sqrt(c.radius*c.radius/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));pp.p2.x = (c.x - sqrt(c.radius*c.radius/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));pp.p1.y = (p.y + (pp.p1.x -p.x)*(c.y-p.y)/(c.x-p.x));pp.p2.y = (p.y + (pp.p2.x -p.x)*(c.y-p.y)/(c.x-p.x));return pp;
}int main( )
{Circle c1(3,2,4);Point p1(1,1);DoublePoint pp;pp = crossover_point(p1,c1);cout<<"点p1: "<<p1<<endl;cout<<"与圆c1: "<<c1<<endl;cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;cout<<"交点1: "<<pp.p1<<endl;cout<<"交点2: "<<pp.p2<<endl;return 0;
}



=================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====







这篇关于C++第13周(春)项目3 - 与圆心相连的直线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769165

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a