68948


以下のプログラムで質問があります。

  1. この場合、FlyingCircleクラスのインスタンス変数vx,vyはずっと変化しない（例えばFC1の場合は21,11のまま）でしょうか？

  2. インスタンスメソッド moveTo()の処理内容  
`if(xpos < 0 && vx < 0 || xpos > 700 && vx > 0) vx = -vx;`  
`if(ypos < 0 && vy < 0 || ypos > 500 && vy > 0) vy = -vy;` について  
xpos<0はわかりますが（円の中心のx座標が0以下になったらという意味？）、vx<0,vx>0の意味がわかりません。(vyも同様）そもそもvx,vyはnewでコンストラクタを呼び出す際に値を決めているので、0以下になったり、0以上になるということがないと思うのですが、この式はどういう意味なのでしょうか？

  3. メインクラスの下のCircleクラスやFlyingCircleクラスは、Javaのオブジェクト指向では、なんという名前のクラスでしょうか？

[code]

    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;
    
    public class FlyCircle extends JPanel {
        Circle C1;
        FlyingCircle FC1, FC2, FC3;
    
        public FlyCircle() {
            setOpaque(false);
            C1 = new Circle(Color.BLUE, 100, 300, 20);
            FC1 = (new FlyingCircle(Color.RED, 100, 100, 25, 21, 11));
            //  FC2 = (new FlyingCircle(Color.GREEN, 100, 100, 15, 21, 11));
            ///  FC3 = (new FlyingCircle(Color.CYAN, 100, 100, 35, 3, 3));
            ///  FC3.moveTo(300, 300); 
    
            final long tm0 = System.currentTimeMillis();
            new javax.swing.Timer(30, new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    double tm=0.001*(System.currentTimeMillis()-tm0);
                    C1.moveTo((int)(150+70*Math.sin(Math.PI*tm*5)),380);
    
                    FC1.moveTo();
    
                    //      FC2.moveTo(width, height, true);
                    //      FC3.moveTo(width, height, true);
                    repaint();
                }
            }).start();
        }
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D)g;
            C1.draw(g2); FC1.draw(g2);
            //   FC2.draw(g2);
            //   FC3.draw(g2);
        }
    
        public static void main(String[] args) {
            JFrame app = new JFrame();
            app.add(new FlyCircle());
            app.setSize(700, 500);
            app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            app.setVisible(true);
        }
    
        static class Circle{
            Paint pat;
            int xpos, ypos, rad;
            public Circle(Paint p, int x, int y, int r) {
                pat = p; xpos = x; ypos = y; rad = r;
            }
            public void draw(Graphics2D g) {
                g.setPaint(pat);
                g.fillOval(xpos-rad, ypos-rad, 2*rad, 2*rad);
            }
            public void moveTo(int x, int y) {
                xpos = x; ypos = y;
            }
            public int getX() {
                return(xpos);
            }
            public int getY() {
                return(ypos);
            }
            public int getR() {
                return(rad);
            }
            public Paint getPaint() {
                return(pat);
            }
            public void setPaint(Paint p) {
                pat = p;
            }
        }
    
        static class FlyingCircle{
            Paint pat;
            int xpos, ypos, rad;
            double vx, vy;
            public FlyingCircle(Paint p, int x, int y, int r,
                    double vx1, double vy1) {
                pat = p; xpos = x; ypos = y; rad = r; vx = vx1; vy = vy1;
            }
            public void moveTo(int x, int y) {
                xpos = x; ypos = y;
            }
            public void moveTo() {
                xpos += vx; ypos += vy;
                if(xpos < 0 && vx < 0 || xpos > 700 && vx > 0) vx = -vx;
                if(ypos < 0 && vy < 0 || ypos > 500 && vy > 0) vy = -vy;
            }
            public void draw(Graphics2D g) {
                g.setPaint(pat);
                g.fillOval((int)(xpos-rad), (int)(ypos-rad), (int)rad*2, (int)rad*2);
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-07-25T07:40:57.237
68942
2020-07-25T09:08:52.033
2020-07-25T07:50:17.970
3060
39688
question
java
インターフェース（動きのあるクラス）の、速さについて質問です。


> 1.この場合、FlyingCircleクラスのインスタンス変数vx,vyはずっと変化しない（例えばFC1の場合は21,11のまま）でしょうか？

いいえ。  
関数`FlyingCircle.moveTo()`内で下記の様に変更されます。

[code]

            if(xpos < 0 && vx < 0 || xpos > 700 && vx > 0) vx = -vx;
            if(ypos < 0 && vy < 0 || ypos > 500 && vy > 0) vy = -vy;
    
[/code]

> 2.インスタンスメソッド moveTo()の処理内容  
>  if(xpos < 0 && vx < 0 || xpos > 700 && vx > 0) vx = -vx;  
>  if(ypos < 0 && vy < 0 || ypos > 500 && vy > 0) vy = -vy;  
>  について  
>
> xpos<0はわかりますが（円の中心のx座標が0以下になったらという意味？）、vx<0,vx>0の意味がわかりません。(vyも同様）そもそもvx,vyはnewでコンストラクタを呼び出す際に値を決めているので、0以下になったり、0以上になるということがないと思うのですが、この式はどういう意味なのでしょうか？

おそらく左の壁(xpos=0)に当たるかつ、速度が左方向(vx<0)の場合、反射する（vx=-vx）というような処理でしょう。  
同様に右、上、下についても同じ処理をしています。

> 3.メインクラスの下のCircleクラスやFlyingCircleクラスは、Javaのオブジェクト指向では、なんという名前のクラスでしょうか？

CircleクラスやFlyingCircleクラスという名前以外にどういう名前になると思ったんですか？


CC BY-SA 4.0
2020-07-25T09:08:52.033
68948
2020-07-25T09:08:52.033
40962
68942
answer