📜  C ++中关于一条线的点的反射(1)

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

C++中关于一条线的点的反射

在计算机图形学中,点的反射通常是指将一个点绕着一条给定的直线对称,得到其在直线另一侧的相应点。这个过程非常有用,可以用来实现许多图形学算法和效果。

在C++中,我们可以通过简单的数学公式来计算点的反射。下面是一个示例代码,该代码实现了一个名为reflect的函数,它将一个点沿着一条线对称:

#include <iostream>

//定义点和向量的类
class Vector2D {
public:
    double x;
    double y;

    Vector2D(double x, double y) {
        this->x = x;
        this->y = y;
    }

    Vector2D operator- (const Vector2D& vec) const {
        return Vector2D(this->x - vec.x, this->y - vec.y);
    }

    Vector2D operator+ (const Vector2D& vec) const {
        return Vector2D(this->x + vec.x, this->y + vec.y);
    }

    Vector2D operator* (double scalar) const {
        return Vector2D(this->x * scalar, this->y * scalar);
    }

    double dot(const Vector2D& vec) const {
        return this->x * vec.x + this->y * vec.y;
    }

    double cross(const Vector2D& vec) const {
        return this->x * vec.y - this->y * vec.x;
    }

    double length() const {
        return sqrt(this->x * this->x + this->y * this->y);
    }

    Vector2D normalize() {
        double len = this->length();
        if (len > 0) {
            this->x /= len;
            this->y /= len;
        }
        return *this;
    }

    Vector2D reflect(const Vector2D& axis) const {
        double n = 2 * (this->dot(axis));
        Vector2D reflect_vec = axis * n;
        return reflect_vec - *this;
    }
};

int main() {
    Vector2D axis(1, 1); //定义直线向量
    Vector2D point(2, 3); //定义要反射的点
    Vector2D reflected = point.reflect(axis); //计算反射
    std::cout << "The reflected point is: (" << reflected.x << ", " << reflected.y << ")" << std::endl;
    return 0;
}

在这个函数中,我们定义了一个名为Vector2D的类来表示2D空间中的点和向量。Vector2D类重载了加、减、标量乘法、点乘和叉乘等各种运算符,方便我们进行向量计算。

Vector2D类中,我们还定义了一个名为reflect的函数,这个函数接受一个参数axis,表示要进行反射的直线向量。先求出点在直线法向量上的投影,然后将投影乘以2后减去原向量,得到的向量就是反射后的向量。

main函数中,我们定义了一个直线向量axis和一个要反射的点point,然后调用point对象的reflect方法,传入axis作为参数,得到反射后的点向量reflected。最后输出反射后的点向量的坐标。