计算3D平面圆的最小半径

时间:2018-02-18 10:02:12

标签: c++ algorithm math trigonometry unreal-engine4

假设我们有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(边宽) :

enter image description here

请注意,n = 6a = 10只是比喻性的例子。它们可以是任何非零值。

2 个答案:

答案 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;
}

https://ideone.com/zo0HV1

答案 1 :(得分:2)

只需将多边形划分为相同大小的三角形(披萨切片),然后计算其中一个三角形(Delta)的中心角。给定三角形基部(围绕边)a的长度,使用此角度计算三角形的高度。高度等于半径。

auto radius = a / FMath::Tan(Delta / 2.0);

要计算每个“边”中点的坐标,只需使用极坐标:

Polar Coordinates

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);
}