(一二三)矢量坐标计算

简介:

一个类,包含极坐标和直角坐标。

 

两个这样的类对象,通过运算符重载,可以直接相加/相减,并得出一个新的坐标,而这个新坐标,是原来两个对象的矢量相加的结果。

 

代码如下:

//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)。因此,重载负号运算符时,可以作为成员函数,且无需使用参数(隐式的调用类对象自己)。

 

② 关于更多应用——随机漫步问题,可以看书,或者后面的复习题也有。

 


目录
相关文章
|
2月前
|
图形学 计算机视觉
GEE错误——如何将原有矢量将维度转化为地理坐标系,重投影坐标坐标无法实现?
GEE错误——如何将原有矢量将维度转化为地理坐标系,重投影坐标坐标无法实现?
32 0
|
4月前
|
算法
[Halcon&几何] 矩形顶点和对角连线角度计算
[Halcon&几何] 矩形顶点和对角连线角度计算
38 0
|
4月前
[Halcon&几何] 线段中点、端点和角度的计算
[Halcon&几何] 线段中点、端点和角度的计算
52 0
|
4月前
[Halcon&几何] 直线的垂线与延长线的计算
[Halcon&几何] 直线的垂线与延长线的计算
84 1
|
4月前
|
算法 数据可视化 C#
C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法,通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作,得到平滑的曲线坐标点集合。实验结果表明,该算法能够有效地平滑折线,并且具有较高的精度和可控性。
58 0
C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
|
10月前
|
算法 JavaScript 前端开发
84坐标系、02坐标系、百度坐标之间相互转换算法
最近有同学反馈之前的坐标系转换有问题,对之前的工具类进行了修正。 一、地图坐标转换java工具类 包含84坐标系、02坐标系、百度地图、高德地图、腾讯地图坐标之间相互转换的算法 wgs84ToGcj02:将 WGS84 坐标系下的经纬度转换为 GCJ02 坐标系下的经纬度。 gcj02ToWgs84:将 GCJ02 坐标系下的经纬度转换为 WGS84 坐标系下的经纬度。 gcj02ToBd09:将 GCJ02 坐标系下的经纬度转换为 BD09 坐标系下的经纬度。 bd09ToGcj02:将 BD09 坐标系下的经纬度转换为 GCJ02 坐标系下的经纬度。
661 0
84坐标系、02坐标系、百度坐标之间相互转换算法
|
8月前
wustojc2009计算图形面积
wustojc2009计算图形面积
36 0
|
9月前
7.2 向量的坐标
7.2 向量的坐标
39 0
如何判断投影坐标是 3 度带还是 6 度带?如何计算中央子午线经度?
如何判断投影坐标是 3 度带还是 6 度带?如何计算中央子午线经度?
|
计算机视觉
五、OpenCV绘制线、矩形、圆等基本几何形状
通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制
99 0
五、OpenCV绘制线、矩形、圆等基本几何形状