こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

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で教えて頂けると幸いです。

投稿日時 - 2016-01-08 21:12:36

QNo.9108280

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(14)

ANo.17

下記を修正しました(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

投稿日時 - 2016-01-10 21:29:44

ANo.16

訂正です。

> 合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。
> 良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。
>
> Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』
> http://8242.teacup.com/bremen1/bbs/5

↑「iBulletGraphYStep」は横方向の Step なので「iBulletGraphXStep」が正解です。

投稿日時 - 2016-01-10 20:46:48

ANo.15

補足です。

> 合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。
> 良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。
>
> Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』
> http://8242.teacup.com/bremen1/bbs/5

↑(CanvasObj の paint メソッドで synchronized されているので) SinGraph の DrawBullet メソッドに synchronized 修飾子は必要なかったです。

投稿日時 - 2016-01-10 19:48:32

ANo.14

訂正です。

> 合成波を表示できるようになりました(「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++;

投稿日時 - 2016-01-10 18:51:58

ANo.13

プログラムを修正しました。
合成波を表示できるようになりました(「X、Y」(座標)の配列は使っていません)。
良く考えたら「X、Y」(座標)の配列を使わずに合成波を表示するのは、それほど難しくなかったです。

Java2 Appletcation 10『Sin グラフを横スクロールさせる(6)』
http://8242.teacup.com/bremen1/bbs/5

投稿日時 - 2016-01-10 18:29:25

ANo.12

補足。

(合成波は大して綺麗ではないと思うのですが)合成波を作るなら、描画しているドット数分の要素を持つ「X、Y」(座標)配列を作って加算すると言うのが一番 単純な方法だと思います。
スレッドの実行時に必ず初期化(ゼロでオール・クリア)してやる必要があります。

投稿日時 - 2016-01-10 14:25:57

ANo.11

プログラムを修正しました。

> 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

投稿日時 - 2016-01-10 08:22:49

ANo.10

そう言えば、(掲示板なども)実行可能なファイルがダウンロードできると通報されるんだったね(ちなみに実行可能な jar ファイルをアップしてたんだけど)。

Java2 Appletcation 7『Sin グラフを横スクロールさせる(3)』
http://8242.teacup.com/bremen1/bbs/3

synchronized に関し間違っている部分、不要になった部分を変更してあります。
Canvas と SinGraph を分離し、複数の SinGraph を生成できるようにしています。

投稿日時 - 2016-01-10 07:35:49

ANo.9

修正したよー
http://pastebin.com/aNvHrGi8

一応 GeneralPath のメソッド(moveTo, lineTo)ははじめから同期化されてるんで、可視性(amanojaku1 さんの言う volatile がこれを保証する)に関しては問題ないんだけど、一応 path の計算部分と描画部分を同期化しといたよ。後 x軸 y軸追加したよ。

投稿日時 - 2016-01-09 12:30:15

お礼

ありがとうございます!
軸の追加や修正までしていただいて、何から何まで本当に感謝しています。私も今回教えてくださったことを無駄にしないよう頑張ります!

投稿日時 - 2016-01-09 19:38:15

ANo.8

http://pastebin.com/aNvHrGi8

修正したよー

投稿日時 - 2016-01-09 12:21:43

ANo.4

できたよー
これでいいかな?
http://pastebin.com/tW6xHcM8

投稿日時 - 2016-01-08 23:00:17

お礼

すごいです!ありがとうございます!動いています!
私の考えていたものよりも、とても素晴らしいものを受け取らせていただきました。
 これからもプログラミングを勉強し、これらに軸や他の波を足して合成波にしていきたいと思います。本当に感謝しております。ありがとうございました。

投稿日時 - 2016-01-08 23:54:28

ANo.3

とりあえず、私の理解できない部分を外して
int x0, x1, x2, y1, y2;
x0 = 0; y2 = 200; x2=0;
for (int i = 1; i <= 90; i++){
x1 = x2; y1 = y2;
x2 = x0+(int)(i/30.0*200);
y2 =100 -(int)(100*Math.sin(i/30.0*2*Math.PI));
g.drawLine(x1, y1, x2, y2);}

で画像になりました。
微調整はしてください。

投稿日時 - 2016-01-08 22:40:30

補足

ありがとうございます。aの値は200です。
時間によってyの値が変わり波が伝わるプログラミングを書きたいのですが、いったいどこにiを入れればいいのでしょうか。

投稿日時 - 2016-01-08 23:24:49

ANo.2

aは何が入るのですか?(聞き忘れました)
sinは1を超えることが無いですよ。(つまり、aが大きくないと上下につぶれる)
Math.PI/T*t の結果はいくらです?ほぼ0ではないですか?
Tやtは目的通りの値が入っていることは確認しましたか?

投稿日時 - 2016-01-08 22:32:05

ANo.1

x0,T,tは何者ですか?とりあえずコンパイルは通してくださいな。

投稿日時 - 2016-01-08 21:39:07

補足

失礼いたしました。
X0=getWidth()/5; :原点
T:周期
t:時間です。
コンパイルをしたところ、動きはするのですが左に位置する原点は移動せず、右に位置する波が左の原点の方に詰まるだけで全体が波として動かない状態です。

投稿日時 - 2016-01-08 21:59:35

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-