假设我们有N
个3D卡形平面围绕中心原点盘旋,面向中间。
要计算这些平面的位置(相对于原点),我们使用以下内容:
auto Delta = FMath::DegreesToRadians(360.f) / (float)(N);
for (unsigned i = 0; i < N; i++) {
auto X = Radius * FMath::Sin(Delta * (float)i);
auto Y = Radius * FMath::Cos(Delta * (float)i);
auto Location = FVector(X, Y, 0.f);
// Spawn plane actor, set it's location, etc...
}
这很有效。但是现在,让我们说仅指定N
,然后用它来计算Radius
,这样每架飞机的两侧几乎都不会碰到,但不会碰撞。我们需要的是一种计算最小半径的方法。
我意识到我可以从一些高价值开始,在一些演员中产生,检查它们是否发生碰撞,如果它们不是,则删除所有演员并将Radius
减少一些值然后重新开始,直到我们碰撞,但这似乎有点矫枉过正。必须有一种更简单,更数学的方法。
有什么想法吗?这是一张图片,可以帮助您查看我尝试计算的内容,只有 ONLY n
(边数)和a
(边宽) :
请注意,n = 6
和a = 10
只是比喻性的例子。它们可以是任何非零值。
答案 0 :(得分:2)
@KillzoneKid使用我的MSPaint技能更新了问题 说明当前的情况
所以你想知道X和Y在哪里放飞机?当半径已知时应该很容易。也许尝试类似这样的东西(如果它有效)(2D但你可以将它改编为3D):
#include <iostream>
#include <cmath>
int main() {
constexpr double PI = 3.141592653589793238;
double sideWidth = 248;
int countSides = 6;
double deltaAngleRads = 2.0 / countSides * PI;
double minRadius = sideWidth / (2 * std::tan(PI / countSides));
double rads = 0.0;
for (int i = 0; i < countSides; ++i)
{
std::cout << "X=" << minRadius * std::sin(rads) << "\tY=" << minRadius * std::cos(rads) << std::endl;
rads += deltaAngleRads;
}
std::cout << "Min radius: " << minRadius << std::endl;
return 0;
}
答案 1 :(得分:2)
只需将多边形划分为相同大小的三角形(披萨切片),然后计算其中一个三角形(Delta
)的中心角。给定三角形基部(围绕边)a
的长度,使用此角度计算三角形的高度。高度等于半径。
auto radius = a / FMath::Tan(Delta / 2.0);
要计算每个“边”中点的坐标,只需使用极坐标:
E.g :
for (unsigned i = 0; i < N; i++) {
/* ... */
auto x = radius * FMath::Cos(i * Delta + Delta / 2.0);
auto y = radius * FMath::Sin(i * Delta + Delta / 2.0);
}