【发布时间】:2021-09-06 18:41:25
【问题描述】:
假设我们在 2D 空间中有两个点:A(蓝色正方形的中心)和 B(橙色正方形的中心)。 我们还得到了几条固定大小的线以及一条具有最小长度的无限线(如射线)。 此外,我们还有 A 的起始角 alpha。
现在我们如何才能连续排列从 A 开始的固定长度线,然后是无限线,以使第一条线的角度为 alpha 并且无限线正好穿过 B? 另外还有一个限制:
- 两条线之间的角度应该相同(这意味着许多值的星座使解决方案成为不可能,但只考虑具有可能解决方案的那些)
结果可能如下所示(在此示例中,所有段的长度都相同)。想象一条从最后一段延伸的线(代表最小长度的射线)击中 B。
现在我找到了一个程序解决方案,从 A 开始,线段之间的夹角为 180°,并检查来自最终线段的射线是否击中 B。根据这条射线的哪一侧,B 位于,它从 A 重新开始减少或增加角度,直到它超过目标。然后它将步长减半并继续反向直到下一个过冲,依此类推。最终,当步数降至阈值以下时,这将结束。
这张图片展示了寻找半精确角度的所有尝试: 黄色部分是长度有限的部分,其他颜色是无限光线(其中蓝色是解决方案)。
不幸的是,当需要高精度时,这很快就会变得计算量很大。
是否必须有数学方法\解决方案?
我已经意识到这条弧线显然是一个圆的一部分,而且该圆的原点必须位于 A 线的某处,角度为 alpha+/-90°(因此起始线是圆的切线并且具有精确的角度 alpha)。 现在的问题是,如何计算这个圆的半径,使得沿其圆周上的点截取的线段具有所需的长度?
希望有人有想法。 非常感谢!
如果有人感兴趣,请参考上下文:这是针对物理模拟中的一种特殊类型的“关节”,例如用于使网格动画对象灵活且可真实弯曲但不可拉伸。以人体脊柱为例。
这就是为什么线段有一个强制的固定长度,在实践中,B 被强制在射线段的最小长度的末端,但是物理影响可能会稍微拉开它,所以它有要不断修正。 该解决方案将产生比分段之间的单个接头更好的结果,这些接头可以以丑陋的方式以之字形塌陷。 如果准确度足够高,程序计算解决方案看起来已经很有前景,但它的性能不如实时模拟的预期......
【问题讨论】:
-
如果你想要一种数学方法,那么最好在 math.stackexchange.com 上询问
-
起始角 alpha 在什么线/方向和什么线/方向之间?因为我没有看到第二张图片上的迭代解决方案尊重这个 alpha。射线的最小长度是多少?是固定数量的一个段和相同的固定长度还是每个段都有自己的长度?
-
这个问题的未知数是线段之间的角度
alpha(与最后一段和射线之间的角度相同)。使用三角函数和坐标(点 A、B)通常意味着求解未知数为alpha的超越方程。这个方程需要通过迭代来求解。但是你已经找到了一个迭代算法。恕我直言,您最好专注于改进算法。
标签: math geometry game-physics