ルールを知らず失礼しました。改めてお願いします。
課題:ボールを壁に向かって投げて、床に跳ね返りバウンドしなくなるまでの奇跡を求める。配列や関数は必ず入れる。ほかにも工夫できることがあれば行うこと。
このようにつくってみました。しかし、これでは壁にあたって跳ね返りをくりかえししてしまうかんじになり先ほど提示した問題のようになりませんでした。(ピンボールみたい)
int main( void )
{
double x=1.0, y=1.0; //ボールの位置(座標)の値を保持する変数
double vx=1.0, vy=1.0; //ボールの動き(速度)を保持する変数。
const double Lx=50, Ly = 40; //壁の位置を示す定数。
double dt = 1.0; //時間間隔を決める変数。(この場合は定数でも可)
int i=0; //繰り返している数を保持する変数
for ( i=0 ; i< 100 ; i++) {
x = x + vx * dt; //dtだけ時間がたったときのx座標を計算
y = y + vy * dt; //dtだけ時間がたったときのy座標を計算
hanekaeri( x , Lx , vx )
hanekaeri( y , Ly , vy );
cout << x << " " << y << "\n";
}
return 0;
}
[1.4] これに配列や関数をとりいれて、問題のように作成したいのですが、なかなか進みません
[2] 環境
[2.1] OS : Windows
[2.2] コンパイラ名 :visual studio 2005 c++
[3] その他
・勉強し始めて2カ月程度です。教科書の内容は、だいたい理解しているつもりですがまだまだ勉強不足です。
先ほどは失礼しました。改めてお願いします。
Re: 先ほどは失礼しました。改めてお願いします。
フォーラムルールの通り、コードはコードタグで囲って下さい。
また、いちいち新しいトピックを立てなくてもいいです。せめて前トピを「解決済み」にしてください。
跳ね返りを繰り返すのは、反発係数を考慮していないからだと思います。
(ボールの速度が全く減退しない)
また、いちいち新しいトピックを立てなくてもいいです。せめて前トピを「解決済み」にしてください。
跳ね返りを繰り返すのは、反発係数を考慮していないからだと思います。
(ボールの速度が全く減退しない)
Re: 先ほどは失礼しました。改めてお願いします。
h2so5さんも仰られているように、基本的に前のトピックの問題が解決するまでは
新しいトピックを立てずに続けてください。
前の質問に答える形で継続していただくのが望ましいと思います。
またプログラムコードを貼り付けるときは以下のようにcodeタグで囲うことによって
インデントが維持され、コードが見やすく色分けして表示されます。 [/code]
質問に書かれているコードをタグで囲うと以下のようになります。
※コメントの前が全て全角スペースだったため、半角スペースに置き換えました
※1つ目のhanekaeri関数の後ろが;(セミコロン)で終了していなかったため勝手に追記しました
上記のコードにはhanekaeri関数の実体がありませんが、この関数は何もできていないのでしょうか?
もし、あるのであれば上記の通りcodeタグで囲った上で新しいトピックを立てずに返信として記入してください。
また、課題とのことなので使用してよい(又は使用禁止の)関数など分かる範囲でお願いします。
新しいトピックを立てずに続けてください。
前の質問に答える形で継続していただくのが望ましいと思います。
またプログラムコードを貼り付けるときは以下のようにcodeタグで囲うことによって
インデントが維持され、コードが見やすく色分けして表示されます。 [/code]
質問に書かれているコードをタグで囲うと以下のようになります。
※コメントの前が全て全角スペースだったため、半角スペースに置き換えました
※1つ目のhanekaeri関数の後ろが;(セミコロン)で終了していなかったため勝手に追記しました
int main( void )
{
double x=1.0, y=1.0; //ボールの位置(座標)の値を保持する変数
double vx=1.0, vy=1.0; //ボールの動き(速度)を保持する変数。
const double Lx=50, Ly = 40;//壁の位置を示す定数。
double dt = 1.0; //時間間隔を決める変数。(この場合は定数でも可)
int i=0; //繰り返している数を保持する変数
for ( i=0 ; i< 100 ; i++) {
x = x + vx * dt; //dtだけ時間がたったときのx座標を計算
y = y + vy * dt; //dtだけ時間がたったときのy座標を計算
hanekaeri( x , Lx , vx );
hanekaeri( y , Ly , vy );
cout << x << " " << y << "\n";
}
return 0;
}
もし、あるのであれば上記の通りcodeタグで囲った上で新しいトピックを立てずに返信として記入してください。
また、課題とのことなので使用してよい(又は使用禁止の)関数など分かる範囲でお願いします。
Re: 先ほどは失礼しました。改めてお願いします。
ありがとうございます。以後気をつけます。
まだ関数は出来ていません。考えています。月曜日提出になってしまい焦っています。
配列と関数を用いる以外は特に指定はなく、なるべく簡単なプログラムで行うのが望ましいとのことです。
まだ関数は出来ていません。考えています。月曜日提出になってしまい焦っています。
配列と関数を用いる以外は特に指定はなく、なるべく簡単なプログラムで行うのが望ましいとのことです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 先ほどは失礼しました。改めてお願いします。
お聞きしたいのはE さんが書きました:ありがとうございます。以後気をつけます。
まだ関数は出来ていません。考えています。月曜日提出になってしまい焦っています。
配列と関数を用いる以外は特に指定はなく、なるべく簡単なプログラムで行うのが望ましいとのことです。
・配列は、何を格納するつもりですか?
・関数の概要を書けますか?
・壁は四方に存在しないのでしょうか?
・重力加速度や反発係数など物理法則は存在しないのですか?
ですね。
それと最初の
しかし、これでは壁にあたって跳ね返りをくりかえししてしまうかんじになり先ほど提示した問題のようになりませんでした。(ピンボールみたい)
と矛盾しますので、何らかのプログラム出来ているのでは無いでしょうか?
出来れば、そちらも提示していただければアドバイスできると思います。
あと、前のトピックに解決マークを書いてください。
このトピックに関しても解決時には解決マークと完成したコードを貼り付けるようにお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 先ほどは失礼しました。改めてお願いします。
・配列は、床をバウンドする回数をやろうと考えています。
・ボールを壁に向かって投げて、跳ね返りバウンドしなくなるまでの奇跡を求める。(空気抵抗なし)
初速度Vo、壁の反発係数e1、床の反発係数e2、床からボールの高さy、距離x、時間t
跳ね返った時の速度V、投射角度θ、水平方向の速度Vx、鉛直方向の速度Vy、壁に当たった時の時間t’,
ボールを投げる。
y=Vo*sinθ*t-(1/2)*g*t*t
x=Vo*cosθ*t
Vx=Vo*cosθ
Vy=-g*t+Vo*sinθ
壁にあたり跳ね返る。Vx’=e1*Vx、Vy’=Vy
y=Vo*sinθ*t-(1/2)*g*t*t
x=8-Vx’*(t-t’)
Vx=Vx’
Vy=-g*t+Vo*sinθ
跳ね返り、床にバウンドする。(1回目)
y=e2*Vy*t-(1/2)*g*t*t
x=8-Vx’*(t-t’)
Vx=Vx’
Vy=e2*Vy’
(n回目)
y=(e2^n)*Vy*t-(1/2)*g*t*t
x=8-Vx’*(t-t’)
Vx=Vx’
Vy=(e2^n)*Vy’
これをバウンドしなくなるまで行う。
というのを考えました。
・壁は一枚だけで、跳ね返り床にバウンドする設定です。
・重力加速度と反発係数は存在します。
いろいろ参考にしながら、最初に作成してみたのがこれです。直す部分や私が作成したいものと違っていたらアドバイスお願いします。
・ボールを壁に向かって投げて、跳ね返りバウンドしなくなるまでの奇跡を求める。(空気抵抗なし)
初速度Vo、壁の反発係数e1、床の反発係数e2、床からボールの高さy、距離x、時間t
跳ね返った時の速度V、投射角度θ、水平方向の速度Vx、鉛直方向の速度Vy、壁に当たった時の時間t’,
ボールを投げる。
y=Vo*sinθ*t-(1/2)*g*t*t
x=Vo*cosθ*t
Vx=Vo*cosθ
Vy=-g*t+Vo*sinθ
壁にあたり跳ね返る。Vx’=e1*Vx、Vy’=Vy
y=Vo*sinθ*t-(1/2)*g*t*t
x=8-Vx’*(t-t’)
Vx=Vx’
Vy=-g*t+Vo*sinθ
跳ね返り、床にバウンドする。(1回目)
y=e2*Vy*t-(1/2)*g*t*t
x=8-Vx’*(t-t’)
Vx=Vx’
Vy=e2*Vy’
(n回目)
y=(e2^n)*Vy*t-(1/2)*g*t*t
x=8-Vx’*(t-t’)
Vx=Vx’
Vy=(e2^n)*Vy’
これをバウンドしなくなるまで行う。
というのを考えました。
・壁は一枚だけで、跳ね返り床にバウンドする設定です。
・重力加速度と反発係数は存在します。
いろいろ参考にしながら、最初に作成してみたのがこれです。直す部分や私が作成したいものと違っていたらアドバイスお願いします。
#include <studio.h>
main()
{
HBITMAP hbmp_ball;
int b_xx = 0, bd_xx = 10,
b_yy = 0, bd_yy = 10;
unsigned long
tick;
hbmp_ball = gl_loadbitmap("ball.bmp");
if(hbmp_ball == NULL){
printf("ビットマップファイルが見つかりません.\n");
exit(0);
}
gl_openwin(-1, -1, 640, 480, 0);
tick = GetTickCount();
for( ; ; ){
if(GetTickCount() < tick + 50)
continue;
tick = GetTickCount();
gl_fillrect(b_xx, b_yy, b_xx + 16, b_yy + 16, RGB(0, 0, 0));
//横方向の処理
b_xx += bd_xx;
if(b_xx >= 640-16 || b_xx <= 0){
bd_xx = -bd_xx;
}
if(b_xx < 0){
b_xx = 0;
}
if(b_xx > 640-16){
b_xx = 640-16;
}
//縦方向の処理
b_yy += bd_yy;
if(b_yy >= 480-16 || b_yy <= 0){
bd_yy = -bd_yy;
}
if(b_yy < 0){
b_yy = 0;
}
if(b_yy > 480-16){
b_yy = 480-16;
}
gl_drawbitmap(hbmp_ball, b_xx, b_yy, 16, 16, 0, 0);
gl_refresh();
}
}
Re: 先ほどは失礼しました。改めてお願いします。
先ほどのコードとぜんぜん違うような気がするのですが、
これは描画部分のコードで、物理演算のソースは別なのでしょうか?
人に聞く前に自分で実行してみて下さい。
これは描画部分のコードで、物理演算のソースは別なのでしょうか?
期待している動作や、プログラムの構造を一番良く知っているのはEさんなのですから、E さんが書きました:直す部分や私が作成したいものと違っていたらアドバイスお願いします。
人に聞く前に自分で実行してみて下さい。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 先ほどは失礼しました。改めてお願いします。
こちらのコードに酷似しているのですが、自分で書かれたものではありませんね?
http://www.orchid.co.jp/computer/cgame/cgm6.html
正直に書いていただかないと我々もサポートしきれません。
それと、元々の「excelで軌跡を描け」と言うテーマがどこかへすっ飛んでます。
自分のできない事、出来る事を明かした上で、現状で出来る限りのものを出してください。
[追記]
全てのボールの軌跡(座標)を記録するためには必要で、出来れば構造体配列がベストです。
速度はベクトルだけで管理したほうが良いでしょう。
時間がないので、なるべくこの掲示板を訪れてください。
一日1~2回では進むものも進みません。
http://www.orchid.co.jp/computer/cgame/cgm6.html
正直に書いていただかないと我々もサポートしきれません。
それと、元々の「excelで軌跡を描け」と言うテーマがどこかへすっ飛んでます。
自分のできない事、出来る事を明かした上で、現状で出来る限りのものを出してください。
[追記]
回数を数えるだけなら、配列は必要ありません。配列は、床をバウンドする回数をやろうと考えています。
全てのボールの軌跡(座標)を記録するためには必要で、出来れば構造体配列がベストです。
数学的には正しいですが、プログラム的にはかえってややこしい事になると思います。ボールを壁に向かって投げて、跳ね返りバウンドしなくなるまでの奇跡を求める。(空気抵抗なし)
初速度Vo、壁の反発係数e1、床の反発係数e2、床からボールの高さy、距離x、時間t
跳ね返った時の速度V、投射角度θ、水平方向の速度Vx、鉛直方向の速度Vy、壁に当たった時の時間t’,
速度はベクトルだけで管理したほうが良いでしょう。
時間がないので、なるべくこの掲示板を訪れてください。
一日1~2回では進むものも進みません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。