- ベストアンサー
C++ボールの軌跡の表示方法
- 発射角度θと初速度vをキーボードで与えて、画面にボールの軌跡を表示させたいプログラムを作成しています。
- プログラムでは縦に25行、横に100列の仮想空間を利用し、ターゲットとボールの軌跡を画面に表示します。
- 放物線上の軌道を表示するため、放物線の通る部分には"*"を表示させる必要がありますが、その方法がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> grid[][]='*';の[]の中には何をいれればいいのかがわからなくて軌道を描くことができませんでした。 > もう一度教えてくださいませんでしょうか。 なぜ僕のいうとおりにやらない? int t, x, y; for ( x = 0; x < 100; ++x ) { t = xから求める。 y = fy(t); printf("(%d,%d)\n", x, y); } これで出力が 100x25 に収まっていることを確認しなさい。できたら printf(...) を grid[x][y] = '*' に置き換え、ループから抜けたら grid[][]を一気にプリントしなさい。
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
あるいは CX = 100 なのですから、 for ( x = 0; x < 100; ++x ) { t = xから求める。 y = fy(t); ... } の方が楽かもしれません。 いずれにせよ、配列に代入する前に printf("%d,%d)\n", x, y); などでプリントし、動きを'数値'で見てみましょう。 それが 100x25 の空間にきれいに収まればいい。
補足
的確な指示ありがとうございます。 一応最後まで作ってみたのですが #include<stdio.h> #include<math.h> #define CX 100 #define CY 25 #define pi M_PI*theta/180 #define g 9.8 #define t (0.5+i)/(v*cos(pi))/*カーソルの中心0.5+nに到達する各時間*/ main(){ int i,j; double v,theta,x,y,X,Y; char grid[CY][CX]; printf("Input: v (m/s)\n"); scanf("%lf",&v); printf("Input: theta\n"); scanf("%lf",&theta); /*動作確認のために書いてみた部分です x=v*t*cos(pi); y=v*t*sin(pi)-g*t*t/2; X=(int)x; Y=(int)(-0.5*y+24);*/ for(i=0;i<CY;i++) for(j=0;j<CX;j++) grid[i][j]='.'; grid[CY-1][CX-1]='T'; for(i=0;i<CY;i++){for(j=0;j<CX;j++) printf("%c",grid[i][j]); grid[][]='*'; printf("%c",grid[(int)(v*t*cos(pi))][(int)(-0.5*(v*t*sin(pi)-g*t*t/2))]); printf("\n");} } 最後から5行目以降でgrid[][]='*';の[]の中には何をいれればいいのかがわからなくて軌道を描くことができませんでした。もう一度教えてくださいませんでしょうか。おねがいしますm(_ _)m
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
放射物体の位置(x,y)は時間tの関数となるでしょう。 すなわち x = fx(t), y = fy(t) です。 したがって for ( t = 0; t < テキトーな時間; t += テキトーな間隔) { x = fx(t); y = fy(t); gri[x][y] = '*'; } できあがった gri[CX][CY] をプリントすれば、'*'が放物線を描くでしょう。 …ただし、この軌道が次第に動いているように見せるのはちょっと面倒です。それがお望みなのでしょうか?
補足
こんな夜中に神速お返事、本当にありがとうございます。 早速、xとyの式を作ってみました。 for(t=0;t<100;t+=(ここには何をいれればいいのでしょうか?){ x=v*t*cos(pi); y=v*t*sin(pi)-g*t*t/2; gri[x][y]='*'; } 仮に( )内がわかっているとしたら、この文は一番最後の部分に挿入すればいいのでしょうか・・・? ちなみに、軌道を次第に動いて見せるなんて高度なことは、考えたこともありませんでした。今回は必要ないと思いますが、そんなこともできるんだと驚きました。
お礼
お返事ありがとうございます。epistemeさんのいうとおりにやっていなくてごめんなさい。今度はいうとおりにやってみました。初速度30m/s角度30度を入力してprintfにしたところ(x,y)が(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)(12,0)(13,0)(14,0)(15,0)(16,0)(17,0)(18,0)(19,0)(20,0)(21,0)(22,0)(23,0)(24,0)(25,0)(26,10)(27,10)(28,10)(29,10)(30,10)(31,10)(32,10)(33,10)(34,10)(35,10)(36,10)(37,10)(38,10)(39,10)(40,10)(41,10)(42,10)(43,10)(44,10)(45,10)(46,10)(47,10)(48,10)(49,10)(50,10)(51,10)(52,10)(53,10)(54,10)(55,10)(56,10)(57,10)(58,10)(59,10)(60,10)(61,10)(62,10)(63,10)(64,10)(65,10)(66,10)(67,10)(68,10)(69,10)(70,10)(71,10)(72,10)(73,10)(74,10)(75,10)(76,10)(77,10)(78,0)(79,0)(80,0)(81,0)(82,0)(83,0)(84,0)(85,0)(86,0)(87,0)(88,0)(89,0)(90,0)(91,0)(92,0)(93,0)(94,0)(95,0)(96,0)(97,0)(98,0)(99,0)と100x25以内に収まっていたのでそれをgrid[y][x]='*'としてプリントしたら、無事に「・」の領域の中に「*」によって放物線を描くことができました! yの座標が0と10だけなのは、多分式が間違っているんだと思いますが、そこは自分でなんとかします。本当にありがとうございました!M(_ _)M