2012-11-08 35 views
1

假设我有两个10米半径的圆,我想在每个更大的圆上朝z轴放置5个1米半径的圆。 我想让大圈子和小圈子任意移动。大圈子应该能够碰撞,小圈子应该能够碰撞。如何有效地将2d动态对象堆栈到z轴

完成此操作的最佳方法是什么?我碰巧使用Java,但算法/伪代码会很好。

更具体地说;如何将大圆圈的加速度和旋转运动有效地传递到较小的圆圈,同时允许它们动态地移动。我所看到的解决方案往往会在大量数据中变得笨重,特别是当我开始考虑比大圆圈更复杂的对象时,但这可能就是这样。

+0

所以你试图建立一个物理系统的模型,比如“我把这个便士放在这个正在转动的唱机上,然后我在这个便士上面放置一毛钱”?这些“磁盘”是否共用一些轴(如齿轮轴?)它们可以重叠吗?碰撞只发生在飞机上吗?它们是无质量的,真的2D(非常薄)还是有一定的厚度? – Mikeb

+0

如果大圆圈旋转,小圆圈需要围绕它们所在的大圆圈的中心旋转。小圈子“重叠”大圈子,但大圈子不应该彼此重叠,小圈子不应该彼此重叠。技术上有一些质量和厚度。 你可以把大圈看作“小船”,将小圈看作“水手”(自上而下)。 我不太在意离心力。 –

回答

0

听起来像你只需要做一些数学。

假设我们有一个以“r1”为半径的x1,y1的“船”(就像你所称的那样)。 “水手”在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,所以我们也应该把这个旋转应用到水手身上。如果水手只是一个无特色的圈子,那么所有的方向都是一样的,我们可以跳过它。

+0

因此,如果我想扩大这一点,比如说,有一只水手帽子的老鼠,我只需要与水手重新运行相同的公式,就像x1,y1和鼠标一样,x2,y2和A是变化的水手的角度? –

+0

由于鼠标实际上经历了两次旋转(船只旋转,水手......呃移动到船头,无论如何),您必须组合这两个转换。想象一下,你有一个“世界”的参考框架 - 一种转换将你从世界起源带到船上;第二把你从船上带到水手等等。所以你必须解决所有的父变换来获得鼠标的位置。如果一切都是圆形的,你也可能会更喜欢圆柱形的坐标(半径,角度)。 – Mikeb

+0

对。我很惊讶算法很简单。我不能在我的生活中让物体沿着母体旋转产生的弧线移动(嗯,我可以,但它是一个非常丑陋的黑客。)。而且从头开始思考我在三角学方面非常擅长!哦,如果我可怜的老师现在能看到我。 谢谢。我会看看我是否可以有效地实施。 –