概述
一个类,包含极坐标和直角坐标。
两个这样的类对象,通过运算符重载,可以直接相加/相减,并得出一个新的坐标,而这个新坐标,是原来两个对象的矢量相加的结果。
代码如下:
//Point.h 包含类定义
#pragma once
class Point
{
public:
enum mode { xy = 0, ji = 1 }; //常量
private:
double x; //x,y坐标
double y;
double jiaodu; //极坐标:角度和长度
double changdu;
int mode; //模式,根据模式来决定坐标输出时的形式
void setxy(); //设置x、y坐标(根据极坐标)
void setji(); //设置极坐标(根据x,y坐标)
public:
void cm(int b = 2); //模式转换,默认参数为2(切模式),也可以给参数,改变转换情况
Point(double a = 0, double b = 0, int c = xy); //默认构造函数。默认为x,y坐标赋值
void reset(double a = 0, double b = 0, int c = xy); //重置坐标
void show()const; //输出坐标
Point operator+(const Point& m)const; //运算符+重载,不用引用是因为要创建一个新对象,然后返回这个对象
Point operator+(double m)const; //再次重载,面对对象是一个double值,直接加在x和y坐标上
Point operator-(const Point& m)const; //运算符-重载,
Point operator*(const double m)const; //运算符*重载,
Point operator/(const double m)const; //运算符/重载,
friend std::ostream& operator<<(std::ostream &os, const Point&m); //用于cout或其他输出
};
//Point.cpp 包含了Point类的成员函数以及友元函数定义
#include<iostream>
#include<cmath>
#include"Point.h"
void Point::setxy() //设置x、y坐标(根据极坐标),函数内容是拿以前的改改
{
const double jiao_to_angle = 57.29577951; //角度/弧度的值大概是这个数
double hudu = jiaodu / jiao_to_angle; //角度除以这个值得到弧度
y = sin(hudu)*changdu; //对边(y) = sin弧度*斜边。
x = cos(hudu)*changdu; //临边(x) = sin弧度*斜边
}
void Point::setji() //设置极坐标(根据x,y坐标)
{
const double jiao_to_angle = 57.29577951; //角度/弧度的值大概是这个数
changdu = sqrt(x*x + y*y); //利用坐标求距离
jiaodu = atan2(y, x)*jiao_to_angle; //利用坐标求角度
}
void Point::cm(int b)
{
if (b == 2)
{
if (mode == ji)mode = xy;
else mode = ji;
}
else if (b == ji)mode = ji;
else if (b == xy)mode = xy;
else std::cout << "参数输出错误,输出模式转换失败。" << std::endl;
}
Point::Point(double a, double b, int c)
{
if (c == xy)
{
x = a;
y = b;
mode = c;
setji();
}
else if (c == ji)
{
jiaodu = a;
changdu = b;
mode = c;
setxy();
}
else std::cout << "参数输入错误。如果你需要输入x、y坐标,请第三个参数输出0或者不输入第三个参数;如果你需要输入极坐标,请第三个参数输入1。" << std::endl;
}
void Point::reset(double a, double b, int c)
{
if (c == xy)
{
x = a;
y = b;
setji();
}
else if (c == ji)
{
jiaodu = a;
changdu = b;
setxy();
}
else std::cout << "参数输入错误。如果你需要输入x、y坐标,请第三个参数输出0或者不输入第三个参数;如果你需要输入极坐标,请第三个参数输入1。" << std::endl;
}
void Point::show()const //输出坐标
{
if (mode == xy)
{
std::cout << "现在报告x,y坐标:" << std::endl;
std::cout << "x:" << x << ",y:" << y << std::endl;
}
else if (mode == ji)
{
std::cout << "现在报告极坐标:" << std::endl;
std::cout << "长度为:" << changdu << ",角度为:" << jiaodu << "度" << std::endl;
}
}
Point Point::operator+(const Point& m)const //运算符+重载,不用引用是因为要创建一个新对象,然后返回这个对象
{
Point q;
q.x = x + m.x;
q.y = y + m.y;
q.mode = mode; //默认模式为运算符前面的对象的显示模式
q.setji();
return q;
}
Point Point::operator+(double m)const
{
Point q;
q.x = x + m;
q.y = y + m;
q.setji();
return q;
}
Point Point::operator-(const Point& m)const //运算符-重载,
{
Point q;
q.x = x - m.x;
q.y = y - m.y;
q.mode = mode;
q.setji();
return q;
}
Point Point::operator*(const double m)const //运算符*重载,
{
Point q;
q.x = x * m;
q.y = y * m;
q.mode = mode;
q.setji();
return q;
}
Point Point::operator/(const double m)const //运算符/重载,
{
Point q;
q.x = x / m;
q.y = y / m;
q.mode = mode;
q.setji();
return q;
}
std::ostream& operator<<(std::ostream &os, const Point&m)
{
m.show();
return os;
}
//1.cpp main()函数所在,用于使用和验证类
#include<iostream>
#include"Point.h"
int main()
{
using namespace std;
Point a; //使用默认构造函数
Point b(3, 4);
Point c(4, 5, Point::ji); //最后的Point::ji表示是极坐标,由于enum在类定义里(公有成员),所以需要作用域解析运算符。或者用1替代也可以
a.show(); //分别显示a、b、c
b.show();
c.show();
cout << "将c以x,y坐标显示:" << endl;
c.cm(0); //更改c的输出模式
c.show(); //显示c
cout << "将b以极坐标显示:" << endl;
b.cm(); //更改b的输出模式
b.show(); //显示b
cout << "a+3=" << a + 3 << endl;
cout << "a-2=" << a - 2 << endl;
cout << "b+c=" << b + c << endl; //注意,显示模式根据运算符前面的类对象而定
cout << "b-c=" << b - c << endl;
cout << "b*2=" << b * 2 << endl;
cout << "b/2=" << b / 2 << endl;
system("pause");
return 0;
}
显示:
现在报告x,y坐标:
x:0,y:0
现在报告x,y坐标:
x:3,y:4
现在报告极坐标:
长度为:5,角度为:4度
将c以x,y坐标显示:
现在报告x,y坐标:
x:4.98782,y:0.348782
将b以极坐标显示:
现在报告极坐标:
长度为:5,角度为:53.1301度
a+3=现在报告x,y坐标:
x:3,y:3
a-2=现在报告x,y坐标:
x:-2,y:0
b+c=现在报告极坐标:
长度为:9.0949,角度为:28.5651度
b-c=现在报告极坐标:
长度为:4.15726,角度为:118.565度
b*2=现在报告极坐标:
长度为:10,角度为:53.1301度
b/2=现在报告极坐标:
长度为:2.5,角度为:53.1301度
请按任意键继续. . .
总结:
① - 运算符除了表示减法(例如a-b),也可以表示负号(例如 -a)。因此,重载负号运算符时,可以作为成员函数,且无需使用参数(隐式的调用类对象自己)。
② 关于更多应用——随机漫步问题,可以看书,或者后面的复习题也有。
最后
以上就是欣慰手套为你收集整理的(一二三)矢量坐标计算的全部内容,希望文章能够帮你解决(一二三)矢量坐标计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复