• ベストアンサー

Java アニメーション(図形の移動)の乱数を使ったプログラムについて

_ranco_の回答

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

衝突検出は、java.awt.Shapeのcontains()やintersects()メソッドを使って行います。衝突を検出したら、移動パラメータの正負をそれまでの逆にしてrepaint()をコールすると、跳ね返りを描けます。 長さ0の線は、無意味です。 乱数は、java.util.RandomのnextInt()を使うと簡単です。

happysun8
質問者

お礼

ご回答ありがとうございます。 参考にさせて頂きます。

関連するQ&A

  • Javaのプログラムで・・・

    Javaのプログラムで1~20までの整数乱数を実行後に指定回数だけ発生させ、そのうち何%が奇数であったかを表示するプログラムを作成中です。 乱数を発生させるところまでは行ったのですがここからどのように計算していくのかわかりません。 以下が作成したものですがアドバイスお願いします。 import java.io.*; public class Rand { public static void main(String args[]) throws IOException { System.out.print("発生させる乱数の回数は?"); BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num= Integer.parseInt(str); for(int i=1;i<=num;i++){ int a=(int)(20*Math.random()+1); System.out.println(a); } for(int a=1; a<=;a++){ if(a%2==1); System.out.println("発生した乱数の"++"%が奇数です。"); } } }

  • 乱数

    乱数x、y(0〈x〈1)、(0〈y〈1)をn回発生させて、これらを座標とする点をx‐y座標平面上にプロットしてこの点と原点との距離が1以下となるときの回数をカウントしm回としてn:m=(長さ1の正方形の面積):(円の4分の1の面積)となる。これを利用して円周率を求めるプログラムなんてどう作るんですか?

  • 線形合同法(乗算型)による乱数発生法

    javaを使って乱数を発生するプログラムを作っています。 線形合同法(乗算型)に基づいて発生させようと思うのですが、疑問点があり質問しました。 乱数発生の漸化式 X(i+1)= a*X(i) (mod M) で、a,M,そして乱数の初期値を決めたいのですが、ネットを使って調べたところ、 a=16807 M=2147483647 が良いという記述がありました。 しかし、これをプログラムに反映させるとintの範囲から出てしまうため、検出値にマイナスが入ってしまいます。 また乱数の初期値に関する記述が見つからなかったので、どのような値にすべきか悩んでいます。 また、検出値をある範囲に(例えば100000まで)にしたい場合は、M=100000にすればいいと思うのですが、その場合のaや初期値の値はどのように決定したらよいのでしょうか? 教えて下さい。よろしくお願いします。

    • ベストアンサー
    • Java
  • 三角分布に従う乱数

    三角分布に従う乱数を発生させるプログラム 最頻値gで、0.8g~2.5gの範囲の三角分布(当然面積は1です)に従う乱数を発生させるプログラムを 書きたいと思っています。 この三角分布の確率密度関数をP(x)とすると、三角分布であるので最頻値gの左側である、傾きが正の直線h(x)と 最頻値gの右側である、傾きが負の直線f(x)で表せますよね 分布に従う乱数を発生させるためには、これら直線の関数を積分したものの逆関数x=P^-1(u) (Pのインバースです) (uは区間[0, 1]の一様乱数)とすればいいというところまでわかったんですが、 とりあえずh(x)とf(x)をそれぞれ積分して逆関数H^-1(u)、F^-1(u)を求めたところまではいいんですが x=H^-1(u)+F^-1(u)としてプログラムを実行すると、最頻値gの2倍あたりの値(例えば20に対して39など) しか出ず、最頻値gより小さい値が出ません。 H^-1(u)+F^-1(u)としているのがダメだと思うのですが、逆関数が2つある場合、ここからどうすればいいですか? また、初歩的な質問なのですが、区間[0, 1]の一様乱数というのはどう記述すればよいですか? ぜひ多くの方の回答お待ちしています。 よろしくお願いします。 (最頻値gは入力で与えるものとします)

  • 重複乱数で処理終了

    java のプログラミングについて質問です。 乱数を発生させ それまでと同じ値が出たら 処理を終了させる。 というプログラムを考えています。 例えば乱数が 1,4,2,6,5,7,9,3,4,3,6,5,4,5,6,7,8,8,9,7,・・・ という順で出た場合 1,4,2,6,5,7,9,3 のみを【表示】させ、処理を終了するというものです。 重複したときに処理を終了する というプログラムが分からない状態です。 分かる方いらっしゃいましたら、ご教授願います。

    • ベストアンサー
    • Java
  • Javaプログラムの繋げ方について。

    Javaプログラムの繋げ方について。 今まで(1)のようなプログラムを書いていました。 作りたいものに向けて色々検索するとやりたいものに近い(2)のようなサンプルプログラムを見つけました。 しかし、Java初心者なもので混ぜ方(?)がわかりません。 現在の私の知識からいうと今までのはアプレットでフレーム使うのはアプリケーションなのかな?別物なのかな?そんな感じです。 もし、混ぜることができるなら何かアドバイスをお願いします。 (1)package test; import java.applet.* ; import java.awt.Label ; import java.awt.Font ; import static java.awt.Font.BOLD ; import java.util.*; import java.awt.Graphics; import java.awt.Image; import java.awt.*; public class test extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); g.fillOval(320, 200, 100, 100); } public void init () { ~~~~~~~~~~~~~~~~ } public void start () { ------------ }}} (2)import java.awt.*; import java.awt.event.*; public class MouseEvent7 extends Frame { int posX = 50; int posY = 50; public static void main(String [] args){ new MouseEvent7(); } //コンストラクタ MouseEvent7(){ this.addWindowListener(new WinAdapter()); //ウィンドウリスナーの登録 this.setSize(200,200); this.setVisible(true); //MouseMotionListenerの登録 addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ posX = e.getX(); posY = e.getY(); repaint(); //paintメソッドを実行 } } ); } public void paint(Graphics g){ g.drawOval(posX,posY,50,50); } } (1)の内容に本当に(2)のプログラムで出来るマウスの動きに合わせて円も動く+クリックしたらそこで止まるだけいいのですが。 出来たら止まった点の座標も取りたいですが、そこまではいってません;;

  • 中学受験 図形

    同じ大きさの正方形3個を右の図のように並べた図形があります。点Aと点Bの位置から直線を2本引きました。図のアとイの角度を合わせると何度になりますか。 どなたか解き方を教えてください、お願いします。

  • 落下する正方形を左右に移動するプログラム

    Javaについての質問です。 正方形を250ミリ秒ごとに5ずつ落下させ、その正方形をボタンで左右に移動できるアップレットを作りたいのですが、 落下はするけど左右に移動しません。改善点が分からないのでアドバイスをお願いします。 また、正方形がアップレットの外に出ないようにし、正方形が下に来た後はボタンを押しても左右に移動しないようにしてください。 また、プログラムはスレッドを定義するものと実行するものの2つあります。 //スレッドを定義する import java.awt.*; class MovingRect extends Thread{ Component component; volatile boolean runFlag = false; //制御用のフラグ volatile int interval; //時間間隔 int x, y; //正方形の始点の位置 //コンストラクタ MovingRect(Component c, int t, int x0, int y0){ runFlag = true; component = c; interval = t; x = x0; y = y0; } public void run(){ //このコンポーネントの境界を表す Rectangle r1 = component.getBounds(); //正方形を5ずつ落下させる //正方形が下に来たら、動きを止める for(; y < r1.height - 20; y += 5){ component.repaint(); try{ Thread.sleep(interval); } catch(InterruptedException e){} if(!runFlag) break; } runFlag = false; component.repaint(); } public void drawFrame(Graphics g){ g.fillRect(x, y, 20, 20); } public void end(){ runFlag = false; } } -------------------------------------------------------------------------- //スレッドを実行するアップレット import java.awt.*; import java.applet.*; import java.awt.event.*; public class MovingRectApp extends Applet implements ActionListener{ MovingRect thread1 = null; Button left, right; int i = 60; //iは正方形の始点のx座標、初期値は60 public void init(){ left = new Button("left"); left.addActionListener(this); add(left); right = new Button("right"); right.addActionListener(this); add(right); } public void actionPerformed(ActionEvent e){ //正方形が左端から出ないようにする if(e.getSource() == left){ i = Math.max(i - 20, 0); } //正方形が右端から出ないようにする else if(e.getSource() == right){ i = Math.min(i + 20, 200); } repaint(); } public void paint(Graphics g){ if(thread1 != null) thread1.drawFrame(g); } public void start(){ //時間間隔は250ミリ秒 thread1 = new MovingRect(this, 250, i, 40); thread1.start(); } public void stop(){ thread1.end(); thread1 = null; } }

    • ベストアンサー
    • Java
  • javaの質問

    自船の初期位置、針路および速力、他船の初期位置、針路および速力を読 み込み、10 分毎に2 時間後までの、自船と他船の位置を求めるプログラムを javaで作成しなさい。 誰かできる方はいらっしゃらないでしょうか。 丸投げで申し訳ありませんが、よろしくお願いします。

  • java プログラム 範囲を指定した乱数

    正規乱数をボックスミューらー法で発生させて、 範囲を指定して出力したいと思ってます。 プログラムを作成してみたのですが・・・ 平均50で範囲を48から52にしたいのですが たまに範囲外というか「0.0」が出力されてしまいます。 アドバイスをください import java.util.*; public class test2{ public static void main(String args[]){ double R,S; double r[]=new double[200];  double s[]=new double[200]; double s1[]=new double[200]; Random ran=new Random();    for(int i=0;i<200;i++){     R=ran.nextDouble(); S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble())); r[i]=R; s1[i]=S; if(50-2<s1[i]){ if(50+2>s1[i]){ s[i]=s1[i]; } } } for(int j=0;j<150;j++){ System.out.println(s[j]); } } } お願いします

    • ベストアンサー
    • Java