C++ 3D 三角形重心坐标计算
以下是使用 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 著作权归作者所有。请勿转载和采集!