🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2047閲覧

X座標とY座標の中間点を求める

NASKA--

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/12/05 17:18

タートルインスタンスを 10 個生成し,配列に格納する。それぞれのタートルインスタン
スの X 座標及び Y 座標は,TurtleFrame の中に収まる範囲で適切に決める。
「start」という文字列をキーボードから受け付けた後,最も距離が遠い二つのタートル
を求め,その二つのタートルを,それぞれの中間点に移動するようなプログラムを作成したい。中間点とは,それぞれの X 座標の真ん中,Y 座標の真ん中の位置を表すもの。

java

1package prog; 2import java.util.Scanner; 3import tg.Turtle; 4import tg.TurtleFrame; 5public class kadai1104 { 6 static Turtle [ ] makeTurtles(int n, double xmin, double xmax, double ymin, double ymax, double ang) { 7 Turtle[]turtles=new Turtle[n]; 8 TurtleFrame f = new TurtleFrame(); 9 for(int i = 0; i < turtles.length; i++) { 10 double x=xmin + (xmax - xmin) * Math.random(); 11 double y=ymin + (ymax - ymin) * Math.random(); 12 turtles[i]=new Turtle(x,y,ang); 13 f.add(turtles[i]); 14 } 15 return turtles; 16 } 17 public static void main(String[] args) { 18 Scanner sc=new Scanner(System.in); 19 int n=10; 20 Turtle[]turtles=makeTurtles(n,0,360,0,360,180); 21 String st=sc.next(); 22 if(st.equals("start")) { 23 double max = 0.0; 24 for(int i=0; i < n; i++) { 25 for(int k = i + 1; k < n; k++) { 26 double dist =k-i; 27 if(dist > max) max = dist; 28 } 29 turtles[i].moveTo(turtles[i].getX()-max,turtles[i].getY()-max); 30 } 31 } 32 } 33} 34

ここまで自己流に作成してみたのですが、中間点への移動の仕方がなかなか思いつきませんでした。
間違っているとしたら

double dist =k-i;

この部分と

java

1turtles[i].moveTo(turtles[i].getX()-max,turtles[i].getY()-max);

だとは思うのですが、どう変えていけばわかりません。この部分を教えてもらいたいです

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/12/06 02:31 編集

> 「start」という文字列をキーボードから受け付けた後,最も距離が遠い二つのタートルを求め, 提示のコードでは、中間点への移動の前に、そもそも最も距離が遠い2つのタートルを求めていない気がするのですがそんなことはありませんか。 2つのタートルの距離とは、1つ目のタートル座標(x1, y1), 2つ目のそれ(x2, y2)間の線が三角形の斜辺だとして、三平方の定理で得られるものを指しているものだと思います。
YT0014

2020/12/06 04:50

importされている、tgパッケージですが、ドメインなどが設定されておらず、入手方法が不明です。質問への情報の追記をお願いします。
YT0014

2020/12/06 05:00

移動させるのは、1組、2つだけですか?コード上は、全部のタートルを移動させようとしていますが。
YT0014

2020/12/06 05:02

tg.Turtle、tg.TurtleFrameですが、パッケージ名にドメインなどがないため、提供元をご提示いただけないと、仕様も不明で、当然、実証も不可能です。 質問を編集して、提供元などの情報をご提示ください。
guest

回答1

0

ベストアンサー

  1. 10個のインスタンスそれぞれに関して総当たりで計算し、最も遠い2つを抽出する。最も遠いインスタンスのインデックス2つを変数に格納する。
  2. X、Y座標の平均値を算出する。

仰っている「二つのタートルを,それぞれの中間点に移動する」というのは中間点で2つのインスタンスが重なり合うということでよろしいでしょうか。

Java

1double max = 0.0; 2int index1; 3int index2; 4 5for(int i=0; i < n - 1; i++) { // 総当たりアルゴリズムでは外側のループはn-1までとします。(自分自身と比較しないため) 6 for(int k = i + 1; k < n; k++) { 7 // double dist =k-i; 8 9 // 距離の算出は三平方の定理で。 10 double dist = Math.sqrt(Math.pow(turtle[i].getX() - turtle[k].getX(), 2) + Math.pow(turtle[i].getY() - turtle[k].getY(), 2)); 11 if(dist > max) { 12 max = dist; 13 index1 = i; 14 index2 = k; 15 } 16 } 17 // turtles[i].moveTo(turtles[i].getX()-max,turtles[i].getY()-max); 18} 19// 総当たりループを回り切るとindex1とindex2には最も遠いインスタンスのインデクスが格納されている。 20 21// 平均値を中間点として算出。 22double midX = (turtle[index1].getX() + turtle[index2].getX()) / 2; 23double midY = (turtle[index1].getY() + turtle[index2].getY()) / 2; 24 25turtle[index1].moveTo(midX, midY); 26turtle[index2].moveTo(midX, midY);

こんな感じかと。

Java最近書いていないので、セミコロンとか抜けているかもしれませんが、そこはご容赦ください。

投稿2020/12/06 15:25

quadii.shii

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問