- 締切済み
JAVAでの動く波のプログラミング
Javaのプログラミングに関する質問です。 Javaを勉強中なのですが、sin波を動かす式がどうにも出来ません。以下は私が現状で考えたプログラミングです。 int x1, x2, y1, y2; x2 = getWidth()/5; y2 = getHeight()/2; for (int i = 1; i <= 90; i++){ x1 = x2; y1 = y2; x2 = x0+(int)(i/30.0*200); y2 =getHeight()/2 -(int)(a*Math.sin(i/30.0*2*Math.PI/T*t)); g.drawLine(x1, y1, x2, y2); } なんとか独学でこのようなものを考えたのですがまるでダメです。よろしければ止まっている波ではなく動く波のプログラミングの仕方をJavaで教えて頂けると幸いです。
- みんなの回答 (14)
- 専門家の回答
みんなの回答
- amanojaku1
- ベストアンサー率54% (265/488)
下記を修正しました(Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』(改2)を参照して下さい)。 > CanvasObj の paint メソッド内に間違いがありました。 > 「vdGraphX2 = iGraphXStep;」の位置を変更。 > 「iBulletGraphYStep」は横方向の Step なので「iBulletGraphXStep」が正解です。 Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』(改2) http://8242.teacup.com/bremen1/bbs/7
- amanojaku1
- ベストアンサー率54% (265/488)
訂正です。 > 合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。 > 良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。 > > Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』 > http://8242.teacup.com/bremen1/bbs/5 ↑「iBulletGraphYStep」は横方向の Step なので「iBulletGraphXStep」が正解です。
- amanojaku1
- ベストアンサー率54% (265/488)
補足です。 > 合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。 > 良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。 > > Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』 > http://8242.teacup.com/bremen1/bbs/5 ↑(CanvasObj の paint メソッドで synchronized されているので) SinGraph の DrawBullet メソッドに synchronized 修飾子は必要なかったです。
- amanojaku1
- ベストアンサー率54% (265/488)
訂正です。 > 合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。 > 良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。 > > Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』 > http://8242.teacup.com/bremen1/bbs/5 ↑CanvasObj の paint メソッド内に間違いがありました。 > if( 2<=dl1oSinGraph.size( ) && 0<iGraphXStep ){ > vdGraphY1 = iHeight/2-vdWaveY1*vdWaveYRate; > vdGraphY2 = iHeight/2-vdWaveY2*vdWaveYRate; > oGraphic2D.setColor(Color.WHITE); > oGraphic2D.drawLine( > (int)Math.round(vdGraphX1), (int)Math.round(vdGraphY1), > (int)Math.round(vdGraphX2), (int)Math.round(vdGraphY2)); > } > iGraphXStep++; > vdGraphX2 = iGraphXStep; 「vdGraphX2 = iGraphXStep;」の位置を変更。 vdGraphX2 = iGraphXStep; if( 2<=dl1oSinGraph.size( ) && 0<iGraphXStep ){ vdGraphY1 = iHeight/2-vdWaveY1*vdWaveYRate; vdGraphY2 = iHeight/2-vdWaveY2*vdWaveYRate; oGraphic2D.setColor(Color.WHITE); oGraphic2D.drawLine( (int)Math.round(vdGraphX1), (int)Math.round(vdGraphY1), (int)Math.round(vdGraphX2), (int)Math.round(vdGraphY2)); } iGraphXStep++;
- amanojaku1
- ベストアンサー率54% (265/488)
プログラムを修正しました。 合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。 良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。 Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』 http://8242.teacup.com/bremen1/bbs/5
- amanojaku1
- ベストアンサー率54% (265/488)
補足。 (合成波は大して綺麗ではないと思うのですが)合成波を作るなら、描画しているドット数分の要素を持つ「X、Y」(座標)配列を作って加算すると言うのが一番 単純な方法だと思います。 スレッドの実行時に必ず初期化(ゼロでオール・クリア)してやる必要があります。
- amanojaku1
- ベストアンサー率54% (265/488)
プログラムを修正しました。 > Java2 Appletcation 7『Sin グラフを横スクロールさせる(3)』 > http://8242.teacup.com/bremen1/bbs/3 > > synchronized に関し間違っている部分、不要になった部分を変更してあります。 > Canvas と SinGraph を分離し、複数の SinGraph を生成できるようにしています。 ↑(どうもグラフ表示のY軸の中心がズレてるなと思ったら)アプリケーションとして実行する場合の Applet コンポーネントのサイズ設定が間違ってました。 Java2 Appletcation 8『Sin グラフを横スクロールさせる(5)』 http://8242.teacup.com/bremen1/bbs/4
- amanojaku1
- ベストアンサー率54% (265/488)
そう言えば、(掲示板なども)実行可能なファイルがダウンロードできると通報されるんだったね(ちなみに実行可能な jar ファイルをアップしてたんだけど)。 Java2 Appletcation 7『Sin グラフを横スクロールさせる(3)』 http://8242.teacup.com/bremen1/bbs/3 synchronized に関し間違っている部分、不要になった部分を変更してあります。 Canvas と SinGraph を分離し、複数の SinGraph を生成できるようにしています。
- Procs
- ベストアンサー率60% (3/5)
修正したよー http://pastebin.com/aNvHrGi8 一応 GeneralPath のメソッド(moveTo, lineTo)ははじめから同期化されてるんで、可視性(amanojaku1 さんの言う volatile がこれを保証する)に関しては問題ないんだけど、一応 path の計算部分と描画部分を同期化しといたよ。後 x軸 y軸追加したよ。
- Procs
- ベストアンサー率60% (3/5)
http://pastebin.com/aNvHrGi8 修正したよー
- 1
- 2
お礼
ありがとうございます! 軸の追加や修正までしていただいて、何から何まで本当に感謝しています。私も今回教えてくださったことを無駄にしないよう頑張ります!