Geometry 如何有效地向z轴堆叠二维动态对象

Geometry 如何有效地向z轴堆叠二维动态对象,geometry,2d,coordinates,Geometry,2d,Coordinates,假设我有两个10米半径的圆,我想把5个1米半径的圆放在每个更大的圆上,朝向z轴。 我想让大圆圈和小圆圈任意移动。大圆圈应该能够碰撞,小圆圈应该能够碰撞 实现这一目标的最佳方式是什么?我碰巧使用Java,但是一个算法/伪代码就可以了 更具体地说;如何有效地将较大圆的加速度和旋转运动传递给较小圆,同时允许所有圆动态移动。我所看到的解决方案往往难以大量使用,特别是当我开始考虑比大圆更复杂的对象时,但可能就是这样。听起来你只需要做一些数学 假设我们有一艘以x1,y1为中心,半径为r1的“船”(如你所说)

假设我有两个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后,这个方向也旋转了一个角度,所以我们应该把这个旋转也应用到水手身上。如果水手只是一个没有特征的圆圈,那么所有方向都是相同的,我们可以跳过它

所以你们试图模拟一个物理系统,比如“我把这个硬币放在这个正在转动的唱机上,然后我把一角硬币放在这个硬币的上面”?这些“磁盘”是否共享某个轴(如齿轮轴?)它们是否可以重叠?碰撞只发生在飞机上吗?它们是无质量的,真的是2D(内薄的)还是有厚度的?如果大圆在旋转,小圆需要围绕它们所在的大圆的中心旋转。小圆圈与大圆圈“重叠”,但大圆圈不应相互重叠,小圆圈也不应相互重叠。从技术上讲,有一些质量和厚度。你可以把大圆圈想象成“船”,把小圆圈想象成“水手”(自上而下)。我不太关心离心力。所以如果我想扩展这个,比如说,有一只鼠标戴在水手帽上,我所要做的就是重新运行相同的公式,将水手作为x1,y1,鼠标作为x2,y2,a是水手的变化角度?因为鼠标实际上正在经历两次旋转(船旋转,水手……呃……移动到船头,无论什么)你必须组成两个变换。想象你有一个“世界”参考帧-一个变换将您从世界原点带到船上;第二个变换将您从船上带到水手上,等等。因此,您必须解析所有父变换以获得鼠标的位置。此外,您可能更喜欢使用圆柱坐标(半径、角度)如果一切都是圆。对。我很惊讶这个算法是多么简单。我一辈子都不能让物体沿着父体旋转产生的弧线移动(我可以,但这是一个非常丑陋的技巧。).想想以前我很擅长三角学!哦,如果我可怜的老师现在能看到我的话。谢谢。我会看看我是否能有效地实施这一点。