gpt4 book ai didi

c++ - 在 C 或 C++ 中的 3D 空间实现中从 3 个点构建圆

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:03 25 4
gpt4 key购买 nike

我们有 3(三)个 xyz 点在 3D 空间中定义一个圆,这个圆需要转换成折线(用于进一步渲染)。我正在寻找可以完成这项工作的现成 C 或 C++ 函数或免费库。

不明白为什么this关门了。我什至不能在那里回答我自己的问题。为你们感到羞耻。但你不会阻止知识的传播!

最佳答案

在真实 3D 中找到圆参数有一个更简单的解决方案,只需看看 http://en.wikipedia.org/wiki/Circumscribed_circle 中的“重心坐标”部分即可。 .您可以从中提取以下优化代码:

// triangle "edges"
const Vector3d t = p2-p1;
const Vector3d u = p3-p1;
const Vector3d v = p3-p2;

// triangle normal
const Vector3d w = t.crossProduct(u);
const double wsl = w.getSqrLength();
if (wsl<10e-14) return false; // area of the triangle is too small (you may additionally check the points for colinearity if you are paranoid)

// helpers
const double iwsl2 = 1.0 / (2.0*wsl);
const double tt = t*t;
const double uu = u*u;

// result circle
Vector3d circCenter = p1 + (u*tt*(u*v) - t*uu*(t*v)) * iwsl2;
double circRadius = sqrt(tt * uu * (v*v) * iwsl2*0.5);
Vector3d circAxis = w / sqrt(wsl);

然后您也可以在真实 3D 中计算圆上的点,例如在 OpenGL 中使用 GL_LINE_STRIP 绘制它们。这应该比使用 2D sin/cos 方法快得多。

// find orthogonal vector to the circle axis
const Vector3d an = circAxis.getNormalized();
const Vector3d ao = Vector3d(4.0+an[0], 4.0+an[0]+an[1], 4.0+an[0]+an[1]+an[2]).crossProduct(an).getNormalized();

// 4x4 rotation matrix around the circle axis
const int steps = 360; // maybe adjust according to circle size on screen
Matrix4d R = makeRotMatrix4d(circCenter, circAxis, 2.0*M_PI/double(steps));

// one point on the circle
Vector3d cp = circCenter + ao*circRadius;

// rotate point on the circle
for (int i=0; i<steps; ++i)
{
circlePoints.push_back(cp);
cp = transformPoint(cp, R); // apply the matrix
}

要创建转换矩阵(即 makeRotMatrix4d()),请参阅 http://paulbourke.net/geometry/rotate/例如。

请注意,我没有测试上面的代码是否真的编译,但它应该给你足够的提示。

关于c++ - 在 C 或 C++ 中的 3D 空间实现中从 3 个点构建圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13977354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com