【发布时间】:2018-07-28 18:13:26
【问题描述】:
假设我们有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,这样每个平面的边几乎不会接触,但不会发生碰撞。我们需要的是一种计算最小半径的方法。
我意识到我可以从某个高值开始,在一些actor中生成,检查它们是否正在碰撞,如果没有,则删除所有actor并将Radius减少一些值,然后重新开始,直到我们发生碰撞,但这似乎有点矫枉过正。必须有一种更简单、更数学的方法。
有什么想法吗?这是一张图像,可以帮助可视化我正在尝试计算的内容,ONLY n(边数)和 a(边宽):
请注意,n = 6 和 a = 10 只是比喻性的例子。它们可以是任何非零值。
【问题讨论】:
-
一定有,你能更好地解释一下X和Y是什么吗?飞机有多宽?
-
@farbiondriven 我在 UE4 中工作,所以它们是左手的、z 向上的世界坐标。 X & Y 指定围绕原点的圆上的 X/Y 点,距离原点
Radius。 -
谢谢!因此,您需要 N 个演员,并且您想知道他们可以在不相互接触的情况下从原点生成的最小半径。所以你需要知道的最后一件事是宽度,然后它是一个简单的等式。
-
@farbiondriven 我可以计算网格的宽度,但只是为了举例,假设它有 248 个单位宽,我们想要 30 个网格
-
这可能会有所帮助 calculatorsoup.com/calculators/geometry-plane/polygon.php 答案:n = 30,a = 248 m,r = 1179.78 m,R = 1186.28 m,A = 4388790 m2,P = 7440 m,x = 168 °, y = 12°
标签: c++ algorithm math trigonometry unreal-engine4