温馨提示×

能否通过C++的point类实现点的变换和投影

c++
小樊
87
2024-09-25 01:57:17
栏目: 编程语言

当然可以。首先,我们需要定义一个表示点的类 Point,然后实现变换(例如平移、旋转)和投影(例如正交投影、透视投影)的方法。以下是一个简单的示例:

#include <iostream>
#include <cmath>

class Point {
public:
    double x, y, z;

    Point(double x = 0, double y = 0, double z = 0) : x(x), y(y), z(z) {}

    // 平移变换
    Point translate(double dx, double dy, double dz) const {
        return Point(x + dx, y + dy, z + dz);
    }

    // 旋转变换(绕Z轴)
    Point rotateZ(double angle) const {
        double rad = angle * M_PI / 180.0;
        double newX = x * cos(rad) - y * sin(rad);
        double newY = x * sin(rad) + y * cos(rad);
        return Point(newX, newY, z);
    }

    // 投影方法(正交投影)
    Point orthographicProjection(double width, double height, double depth) const {
        double u = (x + 1.0) / 2.0 * width;
        double v = (z + 1.0) / 2.0 * height;
        return Point(u, v, 0);
    }

    // 投影方法(透视投影)
    Point perspectiveProjection(double fov, double aspect, double near, double far) const {
        double range = far - near;
        double n = near + (z - near) * tan(fov * M_PI / 360.0);
        double u = (x + 1.0) / 2.0 * width * (n + near) / range;
        double v = (z + 1.0) / 2.0 * height * (n + near) / range;
        return Point(u, v, n);
    }
};

int main() {
    Point p(1, 1, 1);
    Point translated = p.translate(2, 3, 4);
    Point rotated = p.rotateZ(45);
    Point orthographic = p.orthographicProjection(800, 600, 100);
    Point perspective = p.perspectiveProjection(45, 1, 0.1, 100);

    std::cout << "Original point: (" << p.x << ", " << p.y << ", " << p.z << ")\n";
    std::cout << "Translated point: (" << translated.x << ", " << translated.y << ", " << translated.z << ")\n";
    std::cout << "Rotated point: (" << rotated.x << ", " << rotated.y <<

0