• <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弹性碰撞

        时间:2023-05-28

      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弹性碰撞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:如何在不小于或大于周长的情况下绘制圆的半径 下一篇:Java - 画一个三角形

                  相关文章

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

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

                    1. <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>