質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

タートルグラフィックスで画像のような移動をさせたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 517

Alex_M

score 32

Javaのタートルグラフィックスで以下の画像のような移動をさせたいです

![イメージ説明]
(亀の移動の途中の画像)

実現させたいこと

ある2つのメソッドを使用して完成させたい
望む結果は実現できたのですが、メソッドを使用しての実行ができません。
どのように書き換えたら良いでしょうか?

Turtleのインスタンスを20個生成し配列turtlesに格納します。
(生成するX, Y座標はどちらも 50.0以上350.0以上とする)
以下の条件でタートルを移動させます

・全タートルの移動先のY座標は、全タートルの移動前のY座標の平均値

・奇数に格納されているインデックスのX座標の移動先は、全タートルの移動前のX座標の最小値
・偶数に格納されているインデックスのX座標の移動先は、全タートルの移動前のX座標の最大値

・以下の2つのメソッドを使用して完成させる

    static void alignY(Turtle t1, Turtle t2) {//t2をt1のYに
        double t1y = t1.getY();
        double t2x = t2.getX();
        t2.moveTo(t2x,t1y);//t2をt1のY座標に移動 xは変わらない、yはt1のもの
    }
    static void alignX(Turtle t1, Turtle t2) {//t2をt1のXに
        double t2y = t2.getY();
        double t1x = t1.getX();
        t2.moveTo(t1x,t2y);//t2をt1のX座標に移動 xはt1のもの、yは変わらない
    }

という条件のもとプロログラムを書きます。

発生している問題・エラーメッセージ

上記したメソッドを用いての記述方法がわかりません。

その代わりに

            if(i % 2 == 0) {
                turtles[i].moveTo(maxBeta,ave);
            }else if(i % 2 != 0){
                turtles[i].moveTo(minBeta, ave);
            }


と記述しています。

全体のソースコード

import javafx.scene.paint.Color;
import tg.Turtle;
import tg.TurtleFrame;

public class Movekame {
    static double getRandomDouble(double low, double high) {
        double ans = 0.0;
        double r = Math.random();
        ans = low + r * high;
        return ans;
    }
    /*static void alignY(Turtle t1, Turtle t2) {//t2をt1のYに
        double t1y = t1.getY();
        double t2x = t2.getX();
        t2.moveTo(t2x,t1y);//t2をt1のY座標に移動 xは変わらない、yはt1のもの
    }
    static void alignX(Turtle t1, Turtle t2) {//t2をt1のXに
        double t2y = t2.getY();
        double t1x = t1.getX();
        t2.moveTo(t1x,t2y);//t2をt1のX座標に移動 xはt1のもの、yは変わらない
    }*/

    public static void main(String[] args) {
        int n = 20;
        Turtle turtles[] = new Turtle[n];
        TurtleFrame f = new TurtleFrame();

        for(int i = 0; i < n; i++) {
            double x = getRandomDouble(50.0,350.0);
            double y = getRandomDouble(50.0,350.0);
            turtles[i] = new Turtle(x,y,180.0);
            f.add(turtles[i]);
        }
        //////
        for(int i = 0; i < n; i++) {
            if(i % 2 == 0) {
                turtles[i].setColor(Color.RED);
            }
        }
        //////

        double sum = 0;
        double ave;

        for(int i=0 ; i < n; i++) {
            sum += turtles[i].getY();
        }

        ave = sum / n;

        System.out.println("Y座標の合計:"+ sum);
        System.out.println("Y座標の平均:"+ ave);
        int idxMax = 0;//最大候補のインデックス
        double maxBeta = 0;//最大候補の値
        int idxMin = 0;//最小候補のインデックス
        double minBeta = 350;//最小候補の値
        //X, Y座標はどちらも 50.0以上350.0未満とする
        for(int i = 0; i < n; i++) {
            if(turtles[i].getX() >= maxBeta) {
                maxBeta = turtles[i].getX();//最大値候補を更新
                idxMax = i;//最大候補のインデックスを更新
                System.out.println("maxBeta : "+ maxBeta +", idxMax : "+ idxMax);
            }
            if(turtles[i].getX() <= minBeta) {
                minBeta = turtles[i].getX();//最小値候補を更新
                idxMin = i;//最小候補のインデックスを更新
                System.out.println("minBeta : "+ minBeta +", idxMin : "+ idxMin);
            }
        }
        System.out.println("X座標のmax : "+ maxBeta +", min : "+ minBeta);
        for(int i = 0; i < n; i ++) {
            System.out.println();
            if(i % 2 == 0) {
                System.out.println("偶数");
                System.out.println("i : "+i);

                turtles[i].moveTo(maxBeta,ave);

                System.out.println(i +"の x, y座標 = " + turtles[i].getX() + ", "+ turtles[i].getY());
            }else if(i % 2 != 0){
                System.out.println("奇数 : ");
                System.out.println("i : " + i);

                turtles[i].moveTo(minBeta, ave);
                System.out.println(i + "の x, y座標 = " + turtles[i].getX() + ", "+ turtles[i].getY());
            }
        }
    }
}

試したこと

メソッドを使用せず直接書き込んで作成した。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

alignX/Y は座標値を直接指定せず, Turtle で指定します. ですので, 別途 Turtle を生成して座標を設定し, 各Turtle の設定に使用しては如何でしょうか.

  double sum = turtles[0].getY();
  Turtle max = turtles[0];//最大候補
  Turtle min = turtles[0];//最小候補
  for(int i = 1; i < n; i++) {
    sum += turtles[i].getY();
    if(turtles[i].getX() > max.getX()) {
      max = turtles[i];//最大値候補を更新
      System.out.println("maxBeta : "+ max.getX() +", idxMax : "+ i);
    }
    if(turtles[i].getX() < min.getX()) {
      min = turtles[i];//最小値候補を更新
      System.out.println("minBeta : "+ min.getX() +", idxMin : "+ i);
    }
  }
  Turtle ave = new Turtle(0,sum/n,0.0); // yのみ使用する
  System.out.println("Y座標の合計:"+ sum);
  System.out.println("Y座標の平均:"+ ave.getY());
  System.out.println("X座標のmax : "+ max.getX() +", min : "+ min.getX());

  for(int i = 0; i < n; i ++) {
    System.out.println();
    if(i % 2 == 0) {
      System.out.println("偶数");
      alignX(max, turtles[i]);
    }else{
      System.out.println("奇数 : ");
      alignX(min, turtles[i]);
    }
    alignY(ave, turtles[i]);
    System.out.println("i : " + i);
    System.out.println(i + "の x, y座標 = " + turtles[i].getX() + ", "+ turtles[i].getY());
  }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る