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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.