📜  用户定义大小的C++中的2D矢量(1)

📅  最后修改于: 2023-12-03 15:11:18.888000             🧑  作者: Mango

用户定义大小的C++中的2D矢量

概述

在许多计算机图形程序中,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矢量数据类型,并实现了其中的基本操作和成员函数。这种方法可以方便地用于各种计算机图形编程,非常实用。