假设我有两个 10 米半径的圆圈,我想在每个更大的圆圈上放 5 个 1 米半径的圆圈,朝向 z 轴。我希望大圆圈和小圆圈任意移动。大圆圈应该能够碰撞,小圆圈应该能够碰撞。
实现这一目标的最佳方法是什么?我碰巧使用Java,但是算法/伪代码就可以了。
进一步来说; 如何有效地将较大圆圈的加速度和旋转运动传递给较小的圆圈,同时让它们都动态移动。我看到的解决方案往往在大量使用时变得笨拙,尤其是当我开始考虑比大圆圈更复杂的对象时,但事实可能就是这样。
假设我有两个 10 米半径的圆圈,我想在每个更大的圆圈上放 5 个 1 米半径的圆圈,朝向 z 轴。我希望大圆圈和小圆圈任意移动。大圆圈应该能够碰撞,小圆圈应该能够碰撞。
实现这一目标的最佳方法是什么?我碰巧使用Java,但是算法/伪代码就可以了。
进一步来说; 如何有效地将较大圆圈的加速度和旋转运动传递给较小的圆圈,同时让它们都动态移动。我看到的解决方案往往在大量使用时变得笨拙,尤其是当我开始考虑比大圆圈更复杂的对象时,但事实可能就是这样。
听起来你只需要做一些数学。
假设我们有一条以 x1、y1 为中心、半径为 r1 的“船”(如您所说)。“水手”在 x2, y2 处,半径为 r2,因此 x2 y2 在船的边界内。如果船旋转了某个角度 A,而水手只是与这个旋转框架共同移动,那么水手的新中心位置将旋转相同的角度。
a1 = x2 - x1; //difference between centers, x direction
b1 = y2 - y1; //in y direction
a2 = a1*cos(A) + b1*sin(A); //new difference in x direction
b2 = b1*cos(A) - a1*sin(A); //new difference in y direction
x3 = x1 + a2; //new center position of sailor, x direction
y3 = y1 + b2; // y direction
如果那个圆形(水手)有一些方向,那么它也必须旋转 A - 想想水手的方向与船的径向矢量对齐。在新位置,船旋转了某个角度 A 后,这个方向也旋转了 A,所以我们也应该将该旋转应用于水手。如果水手只是一个没有特征的圆圈,那么所有方向都是相同的,我们可以跳过它。