• <tfoot id='zMPC5'></tfoot>
  • <legend id='zMPC5'><style id='zMPC5'><dir id='zMPC5'><q id='zMPC5'></q></dir></style></legend>

        <bdo id='zMPC5'></bdo><ul id='zMPC5'></ul>

      <i id='zMPC5'><tr id='zMPC5'><dt id='zMPC5'><q id='zMPC5'><span id='zMPC5'><b id='zMPC5'><form id='zMPC5'><ins id='zMPC5'></ins><ul id='zMPC5'></ul><sub id='zMPC5'></sub></form><legend id='zMPC5'></legend><bdo id='zMPC5'><pre id='zMPC5'><center id='zMPC5'></center></pre></bdo></b><th id='zMPC5'></th></span></q></dt></tr></i><div id='zMPC5'><tfoot id='zMPC5'></tfoot><dl id='zMPC5'><fieldset id='zMPC5'></fieldset></dl></div>

        <small id='zMPC5'></small><noframes id='zMPC5'>

      1. 动圈与非动圈的JAVA弹性碰撞

        JAVA elastic collision of moving and non moving circles(动圈与非动圈的JAVA弹性碰撞)

      2. <tfoot id='8Irl8'></tfoot>
          <tbody id='8Irl8'></tbody>
          <legend id='8Irl8'><style id='8Irl8'><dir id='8Irl8'><q id='8Irl8'></q></dir></style></legend>
          <i id='8Irl8'><tr id='8Irl8'><dt id='8Irl8'><q id='8Irl8'><span id='8Irl8'><b id='8Irl8'><form id='8Irl8'><ins id='8Irl8'></ins><ul id='8Irl8'></ul><sub id='8Irl8'></sub></form><legend id='8Irl8'></legend><bdo id='8Irl8'><pre id='8Irl8'><center id='8Irl8'></center></pre></bdo></b><th id='8Irl8'></th></span></q></dt></tr></i><div id='8Irl8'><tfoot id='8Irl8'></tfoot><dl id='8Irl8'><fieldset id='8Irl8'></fieldset></dl></div>

                <bdo id='8Irl8'></bdo><ul id='8Irl8'></ul>

                <small id='8Irl8'></small><noframes id='8Irl8'>

                1. 本文介绍了动圈与非动圈的JAVA弹性碰撞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我正在尝试编写一个 Java 移动应用程序 (J2ME),但遇到了一个问题:在我的项目中,有称为镜头的移动圆圈和称为球体的非移动圆圈.当一个球击中球体时,它应该按照经典物理定律反弹.但是我找不到这种算法.

                  I'm trying to write a java mobile application (J2ME) and I got stuck with a problem: in my project there are moving circles called shots, and non moving circles called orbs. When a shot hits an orb, it should bounce off by classical physical laws. However I couldn't find any algorithm of this sort.

                  镜头的运动由 x 轴和 y 轴上的速度(像素/更新)来描述.所有关于圆的信息都是已知的:它们的位置、半径和镜头的速度(在 x 轴和 y 轴上).

                  The movement of a shot is described by velocity on axis x and y (pixels/update). all the information about the circles is known: their location, radius and the speed (on axis x and y) of the shot.

                  注意:碰撞后球体不会开始移动,它会停留在原位.碰撞是两者之间的弹性碰撞,而球体保持静止

                  Note: the orb does not start moving after the collision, it stays at its place. The collision is an elastic collision between the two while the orb remains static

                  这里是Shot类中的碰撞解决方法:

                  here is the collision solution method in class Shot:

                  public void collision(Orb o)
                  {
                      //the orb's center point
                      Point oc=new Point(o.getTopLeft().x+o.getWidth()/2,o.getTopLeft().y+o.getWidth()/2);
                      //the shot's center point
                      Point sc=new Point(topLeft.x+width/2,topLeft.y+width/2);
                  
                      //variables vx and vy are the shot's velocity on axis x and y
                      if(oc.x==sc.x)
                      {
                          vy=-vy;
                          return ;
                      }
                  
                      if(oc.y==sc.y)
                      {
                          vx=-vx;
                          return ;
                      }
                  
                      // o.getWidth() returns the orb's width, width is the shot's width
                  
                      double angle=0;  //here should be some sort of calculation of the shot's angle
                      setAngle(angle);
                  }
                  
                  public void setAngle(double angle)
                  {
                      double v=Math.sqrt(vx*vx+vy*vy);
                      vx=Math.cos(Math.toRadians(angle))*v;
                      vy=-Math.sin(Math.toRadians(angle))*v;
                  }
                  

                  提前感谢所有帮助者

                  推荐答案

                  在碰撞点,动量、角动量和能量被保存下来.设m1,m2为圆盘的质量,p1=(p1x,p1y),p2=(p2x,p2y)为碰撞时圆盘中心的位置,u1,u2为碰撞前的速度,v1,v2为碰撞后的速度碰撞.然后守恒定律要求

                  At the point of collision, momentum, angular momentum and energy are preserved. Set m1, m2 the masses of the disks, p1=(p1x,p1y), p2=(p2x,p2y) the positions of the centers of the disks at collition time, u1, u2 the velocities before and v1,v2 the velocities after collision. Then the conservation laws demand that

                  0 = m1*(u1-v1)+m2*(u2-v2)
                  0 = m1*cross(p1,u1-v1)+m2*cross(p2,u2-v2)
                  0 = m1*dot(u1-v1,u1+v1)+m2*dot(u2-v2,u2+v2)
                  

                  使用第一个方程消除 u2-v2

                  Eliminate u2-v2 using the first equation

                  0 = m1*cross(p1-p2,u1-v1)
                  0 = m1*dot(u1-v1,u1+v1-u2-v2)
                  

                  第一个告诉我们 (u1-v1) 和因此 (u2-v2) 是 (p1-p2) 的倍数,脉冲交换是在法线或径向方向,没有切向相互作用.冲动和能量守恒现在导致相互作用常数a,因此

                  The first tells us that (u1-v1) and thus (u2-v2) is a multiple of (p1-p2), the impulse exchange is in the normal or radial direction, no tangential interaction. Conservation of impulse and energy now leads to a interaction constant a so that

                  u1-v1 = m2*a*(p1-p2)
                  u2-v2 = m1*a*(p2-p1)
                  0 = dot(m2*a*(p1-p2), 2*u1-m2*a*(p1-p2)-2*u2+m1*a*(p2-p1))
                  

                  导致非零交互项 a

                  2 * dot(p1-p2, u1-u2) = (m1+m2) * dot(p1-p2,p1-p2) * a
                  

                  现在可以使用分数来解决

                  which can now be solved using the fraction

                  b = dot(p1-p2, u1-u2) / dot(p1-p2, p1-p2)
                  

                  作为

                  a = 2/(m1+m2) * b
                  
                  v1 = u1 - 2 * m2/(m1+m2) * b * (p1-p2)
                  v2 = u2 - 2 * m1/(m1+m2) * b * (p2-p1)
                  

                  要让第二个圆盘静止,设置 u2=0 并且它的质量 m2 非常大或无限大,然后第二个公式说 v2=u2=0 和第一个

                  To get the second disk stationary, set u2=0 and its mass m2 to be very large or infinite, then the second formula says v2=u2=0 and the first

                  v1 = u1 - 2 * dot(p1-p2, u1)/dot(p1-p2, p1-p2) * (p1-p2)

                  <小时>

                  也就是说,v1 是 u1 在以 (p1-p2) 为法线的平面上的反射.请注意,碰撞点的特征是 norm(p1-p2)=r1+r2

                  dot(p1-p2, p1-p2) = (r1+r2)^2
                  

                  这样分母就已经从碰撞检测中知道了.

                  so that the denominator is already known from collision detection.

                  根据您的代码,oc{x,y} 包含固定磁盘或球体的中心,sc{x,y} 包含中心和 {vx,vy} 移动磁盘的速度.

                  Per your code, oc{x,y} contains the center of the fixed disk or orb, sc{x,y} the center and {vx,vy} the velocity of the moving disk.

                  1. 计算 dc={sc.x-oc.x, sc.y-oc.y}dist2=dc.x*dc.x+dc.y*dc.y

                  1.a 检查 sqrt(dist2) 是否足够接近 sc.radius+oc.radius.普遍的传说说比较正方形更有效.如果 dist2 太小,微调交点的位置.

                  1.a Check that sqrt(dist2) is sufficiently close to sc.radius+oc.radius. Common lore says that comparing the squares is more efficient. Fine-tune the location of the intersection point if dist2 is too small.

                  计算 dot = dc.x*vx+dcy*vydot = dot/dist2

                  更新vx = vx - 2*dot*dc.x, vy = vy - 2*dot*dc.y

                  特殊情况包含在这些公式中,例如,对于 dc.y==0,即 oc.y==sc.y 得到 dot=vx/dc.x,所以 vx=-vx, vy=vy 结果.

                  The special cases are contained inside these formulas, e.g., for dc.y==0, that is, oc.y==sc.y one gets dot=vx/dc.x, so that vx=-vx, vy=vy results.

                  这篇关于动圈与非动圈的JAVA弹性碰撞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
                  How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
                  Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
                  Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
                  How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
                  How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)

                  <small id='pSReH'></small><noframes id='pSReH'>

                        <tbody id='pSReH'></tbody>
                      <tfoot id='pSReH'></tfoot>
                        <bdo id='pSReH'></bdo><ul id='pSReH'></ul>

                        • <legend id='pSReH'><style id='pSReH'><dir id='pSReH'><q id='pSReH'></q></dir></style></legend>
                          <i id='pSReH'><tr id='pSReH'><dt id='pSReH'><q id='pSReH'><span id='pSReH'><b id='pSReH'><form id='pSReH'><ins id='pSReH'></ins><ul id='pSReH'></ul><sub id='pSReH'></sub></form><legend id='pSReH'></legend><bdo id='pSReH'><pre id='pSReH'><center id='pSReH'></center></pre></bdo></b><th id='pSReH'></th></span></q></dt></tr></i><div id='pSReH'><tfoot id='pSReH'></tfoot><dl id='pSReH'><fieldset id='pSReH'></fieldset></dl></div>