0

私は Java を初めて使用し、グラフィック用に ACM ライブラリを使用しています。このコードでやろうとしていることは次のとおりです。

  1. 左側に 1 つ、中央に 1 つの 2 つのボールを導入します。どちらもy座標の真ん中にあります。
  2. 2 番目のボールに出会うまで、最初のボールを動かします。次に停止し、2 番目のボールにそのサイズに比例した速度を与えます (運動量の保存に似ています)。
  3. 壁の 2 番目のボールをバウンドさせ、最初のボールに出会うまで移動します。次に停止し、最初のボールにそのサイズに比例した速度をもう一度与えます。
  4. このアクションを無限にします。

私のコードは次のとおりです。

import java.awt.Color;

import acm.graphics.*;
import acm.program.*;
import acm.util.RandomGenerator;

public class Collision extends GraphicsProgram {

    private static final double RADIUS_ONE = 35;
    private static final double RADIUS_TWO = 65; 

    public void run() {

        GOval ballOne = new GOval(0, (getHeight() - RADIUS_ONE)/2, RADIUS_ONE, RADIUS_ONE);
        ballOne.setFilled(true);
        ballOne.setColor(Color.GREEN);
        add(ballOne);

        GOval ballTwo = new GOval((getWidth() - RADIUS_TWO)/2, (getHeight() - RADIUS_TWO)/2, RADIUS_TWO, RADIUS_TWO);
        ballTwo.setFilled(true);
        ballTwo.setColor(Color.ORANGE);
        add(ballTwo);

        double velocityOne = 3;
        double velocityTwo = 0;

        while (true) {  

            ballOne.move(velocityOne, 0);
            ballTwo.move(velocityTwo, 0);

            if (ballOne.getX() >= getWidth() - RADIUS_ONE || ballOne.getX() <= 0) {
                velocityOne = -velocityOne;
            }
            if (ballTwo.getX() >= getWidth() - RADIUS_TWO || ballTwo.getX() <= 0) {
                velocityTwo = -velocityTwo;
            }

            if (ballOne.getX() + RADIUS_ONE >= ballTwo.getX()) {

                if (velocityTwo == 0) {
                    velocityTwo = (velocityOne * RADIUS_ONE * RADIUS_ONE)/(RADIUS_TWO * RADIUS_TWO);
                    velocityOne = 0;
                } else if (velocityOne == 0) {
                    velocityOne = (velocityTwo * RADIUS_TWO * RADIUS_TWO)/(RADIUS_ONE * RADIUS_ONE);
                    velocityTwo = 0;
                }

            }

            pause(10);
        }
    }
}

このコードを実行すると、誤動作することがわかります。2番目のボールに出会うと、最初のボールは動きを止めず、2番目のボールと一緒に動きます. ただしvelocityOne、3 ではなく 2 に変更すると、すべて正常に動作します。またはRADIUS_TWO、65 ではなく 45 にすると、コードは のすべての値に対して正常に機能しますvelocityOne

このコードがほとんどの値で誤動作しているのに、ほとんどの値で正常に動作している理由を誰か説明してもらえますか? どうもありがとう。

4

1 に答える 1