📅  最后修改于: 2023-12-03 15:11:18.888000             🧑  作者: Mango
在许多计算机图形程序中,2D矢量是常见的数据类型。C++语言中,可以通过自定义数据类型来表示2D矢量。本文介绍如何在C++中定义大小可变的2D矢量,并实现其中的基本操作。
我们可以使用结构体来定义一个2D矢量。具体实现如下:
struct Vector2D {
float x;
float y;
};
这个结构体包含了两个浮点数作为矢量的横坐标和纵坐标。
接下来,我们实现结构体的构造函数。由于结构体自带默认构造函数,我们只需要实现自定义构造函数。
Vector2D::Vector2D(float x, float y): x(x), y(y) {}
这个构造函数接受两个参数,分别表示矢量的横坐标和纵坐标。
接下来,我们实现常用的操作符重载,使得2D矢量能够完成常见的加、减、乘、除、点乘等操作。
Vector2D Vector2D::operator+(const Vector2D& v) const {
return Vector2D(x + v.x, y + v.y);
}
Vector2D Vector2D::operator-(const Vector2D& v) const {
return Vector2D(x - v.x, y - v.y);
}
Vector2D Vector2D::operator*(float s) const {
return Vector2D(x * s, y * s);
}
float Vector2D::operator*(const Vector2D& v) const {
return x * v.x + y * v.y;
}
Vector2D Vector2D::operator/(float s) const {
if (s == 0) return Vector2D(x, y);
return Vector2D(x / s, y / s);
}
Vector2D& Vector2D::operator+=(const Vector2D& v) {
x += v.x;
y += v.y;
return *this;
}
Vector2D& Vector2D::operator-=(const Vector2D& v) {
x -= v.x;
y -= v.y;
return *this;
}
Vector2D& Vector2D::operator*=(float s) {
x *= s;
y *= s;
return *this;
}
Vector2D& Vector2D::operator/=(float s) {
if (s == 0) return *this;
x /= s;
y /= s;
return *this;
}
其中,加、减、乘、除分别用运算符+、-、、/表示,点乘用运算符表示。加上等于、减去等于、乘以等于、除以等于分别用运算符+=、-=、*=、/=表示。
接下来,我们实现一些常见的成员函数,如获取矢量长度、归一化矢量等。
float Vector2D::Length() const {
return sqrt(x * x + y * y);
}
Vector2D Vector2D::Normalize() const {
float len = Length();
if (len == 0) return Vector2D(x, y);
return Vector2D(x / len, y / len);
}
float Vector2D::Angle() const {
return atan2(y, x);
}
Vector2D Vector2D::Rotate(float angle) const {
float s = sin(angle);
float c = cos(angle);
return Vector2D(x * c - y * s, x * s + y * c);
}
其中,Length()用于获取矢量的长度,Normalize()用于将矢量归一化,Angle()用于获取矢量与x轴正方向形成的夹角,Rotate()用于将矢量按照一定角度旋转。
最后,我们实现一个简单的示例来演示如何使用上述定义的Vector2D。
#include <iostream>
#include "Vector2D.h"
int main() {
Vector2D v1(1, 2);
Vector2D v2(3, 4);
std::cout << "v1 = (" << v1.x << ", " << v1.y << ")" << std::endl;
std::cout << "v2 = (" << v2.x << ", " << v2.y << ")" << std::endl;
std::cout << "v1 + v2 = (" << (v1 + v2).x << ", " << (v1 + v2).y << ")" << std::endl;
std::cout << "v1 - v2 = (" << (v1 - v2).x << ", " << (v1 - v2).y << ")" << std::endl;
std::cout << "3*v1 = (" << (3 * v1).x << ", " << (3 * v1).y << ")" << std::endl;
std::cout << "v1* v2 = " << (v1 * v2) << std::endl;
std::cout << "v1/ 2 = (" << (v1 / 2).x << ", " << (v1 / 2).y << ")" << std::endl;
return 0;
}
在执行这段代码之前,需要确保头文件Vector2D.h已经正确定义。运行这段代码后,输出结果如下:
v1 = (1, 2)
v2 = (3, 4)
v1 + v2 = (4, 6)
v1 - v2 = (-2, -2)
3*v1 = (3, 6)
v1* v2 = 11
v1/ 2 = (0.5, 1)
可以看到,所有定义的操作和成员函数都得到了正确的结果。
本文介绍了如何在C++中自定义2D矢量数据类型,并实现了其中的基本操作和成员函数。这种方法可以方便地用于各种计算机图形编程,非常实用。