以下是使用 C++ 代码计算 3D 三角形中点的重心坐标的示例:

#include <iostream>
#include <cmath>

struct Vector3 {
    double x, y, z;
    Vector3(double x = 0, double y = 0, double z = 0) : x(x), y(y), z(z) {}
    Vector3 operator+(const Vector3& v) const { return Vector3(x + v.x, y + v.y, z + v.z); }
    Vector3 operator-(const Vector3& v) const { return Vector3(x - v.x, y - v.y, z - v.z); }
    Vector3 operator*(double scalar) const { return Vector3(x * scalar, y * scalar, z * scalar); }
    double dot(const Vector3& v) const { return x * v.x + y * v.y + z * v.z; }
    Vector3 cross(const Vector3& v) const { return Vector3(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); }
    double length() const { return std::sqrt(x * x + y * y + z * z); }
    Vector3 normalize() const { double len = length(); return Vector3(x / len, y / len, z / len); }
};

struct Triangle {
    Vector3 v1, v2, v3;
    Triangle(const Vector3& v1, const Vector3& v2, const Vector3& v3) : v1(v1), v2(v2), v3(v3) {}
};

struct Barycentric {
    double alpha, beta, gamma;
    Barycentric(double alpha = 0, double beta = 0, double gamma = 0) : alpha(alpha), beta(beta), gamma(gamma) {}
};

Barycentric barycentric(const Triangle& tri, const Vector3& p) {
    Vector3 v1 = tri.v2 - tri.v1;
    Vector3 v2 = tri.v3 - tri.v1;
    Vector3 v3 = p - tri.v1;
    double dot11 = v1.dot(v1);
    double dot12 = v1.dot(v2);
    double dot13 = v1.dot(v3);
    double dot22 = v2.dot(v2);
    double dot23 = v2.dot(v3);
    double invDenom = 1 / (dot11 * dot22 - dot12 * dot12);
    double alpha = (dot22 * dot13 - dot12 * dot23) * invDenom;
    double beta = (dot11 * dot23 - dot12 * dot13) * invDenom;
    double gamma = 1 - alpha - beta;
    return Barycentric(alpha, beta, gamma);
}

int main() {
    Triangle tri(Vector3(0, 0, 0), Vector3(1, 0, 0), Vector3(0, 1, 0));
    Vector3 p(0.5, 0.5, 0);
    Barycentric bary = barycentric(tri, p);
    std::cout << 'Barycentric coordinates: alpha = ' << bary.alpha << ', beta = ' << bary.beta << ', gamma = ' << bary.gamma << std::endl;
    return 0;
}

这段代码定义了三个结构体:Vector3 用于表示 3D 向量,Triangle 用于表示三角形,Barycentric 用于表示重心坐标。barycentric 函数接收一个三角形和 3D 空间中的一个点,并返回其重心坐标作为 Barycentric 对象。main 函数创建了一个 Triangle 对象和一个 3D 点,并打印出其重心坐标。

请注意,此代码假设点位于三角形内部。如果点位于三角形外部,重心坐标将为负值。


原文地址: https://www.cveoy.top/t/topic/nGjx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录