先ほどは失礼しました。改めてお願いします。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
E

先ほどは失礼しました。改めてお願いします。

#1

投稿記事 by E » 14年前

ルールを知らず失礼しました。改めてお願いします。
 課題:ボールを壁に向かって投げて、床に跳ね返りバウンドしなくなるまでの奇跡を求める。配列や関数は必ず入れる。ほかにも工夫できることがあれば行うこと。 
このようにつくってみました。しかし、これでは壁にあたって跳ね返りをくりかえししてしまうかんじになり先ほど提示した問題のようになりませんでした。(ピンボールみたい)
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カ月程度です。教科書の内容は、だいたい理解しているつもりですがまだまだ勉強不足です。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 先ほどは失礼しました。改めてお願いします。

#2

投稿記事 by h2so5 » 14年前

フォーラムルールの通り、コードはコードタグで囲って下さい。
また、いちいち新しいトピックを立てなくてもいいです。せめて前トピを「解決済み」にしてください。

跳ね返りを繰り返すのは、反発係数を考慮していないからだと思います。
(ボールの速度が全く減退しない)

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: 先ほどは失礼しました。改めてお願いします。

#3

投稿記事 by 沖 滉均 » 14年前

h2so5さんも仰られているように、基本的に前のトピックの問題が解決するまでは
新しいトピックを立てずに続けてください。
前の質問に答える形で継続していただくのが望ましいと思います。

またプログラムコードを貼り付けるときは以下のようにcodeタグで囲うことによって
インデントが維持され、コードが見やすく色分けして表示されます。

コード:

[code]int main(){
    プログラムの内容
    return 0;
}
[/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;
}
上記のコードにはhanekaeri関数の実体がありませんが、この関数は何もできていないのでしょうか?
もし、あるのであれば上記の通りcodeタグで囲った上で新しいトピックを立てずに返信として記入してください。
また、課題とのことなので使用してよい(又は使用禁止の)関数など分かる範囲でお願いします。
There is no royal road to learning.
codeタグで指定できる言語
画像

Re: 先ほどは失礼しました。改めてお願いします。

#4

投稿記事 by » 14年前

ありがとうございます。以後気をつけます。

まだ関数は出来ていません。考えています。月曜日提出になってしまい焦っています。

配列と関数を用いる以外は特に指定はなく、なるべく簡単なプログラムで行うのが望ましいとのことです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 先ほどは失礼しました。改めてお願いします。

#5

投稿記事 by softya(ソフト屋) » 14年前

E さんが書きました:ありがとうございます。以後気をつけます。

まだ関数は出来ていません。考えています。月曜日提出になってしまい焦っています。

配列と関数を用いる以外は特に指定はなく、なるべく簡単なプログラムで行うのが望ましいとのことです。
お聞きしたいのは
・配列は、何を格納するつもりですか?
・関数の概要を書けますか?
・壁は四方に存在しないのでしょうか?
・重力加速度や反発係数など物理法則は存在しないのですか?
ですね。

それと最初の
しかし、これでは壁にあたって跳ね返りをくりかえししてしまうかんじになり先ほど提示した問題のようになりませんでした。(ピンボールみたい)

と矛盾しますので、何らかのプログラム出来ているのでは無いでしょうか?
出来れば、そちらも提示していただければアドバイスできると思います。

あと、前のトピックに解決マークを書いてください。
このトピックに関しても解決時には解決マークと完成したコードを貼り付けるようにお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Re: 先ほどは失礼しました。改めてお願いします。

#6

投稿記事 by » 14年前

・配列は、床をバウンドする回数をやろうと考えています。
・ボールを壁に向かって投げて、跳ね返りバウンドしなくなるまでの奇跡を求める。(空気抵抗なし)
初速度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();
	}
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 先ほどは失礼しました。改めてお願いします。

#7

投稿記事 by h2so5 » 14年前

先ほどのコードとぜんぜん違うような気がするのですが、
これは描画部分のコードで、物理演算のソースは別なのでしょうか?
E さんが書きました:直す部分や私が作成したいものと違っていたらアドバイスお願いします。
期待している動作や、プログラムの構造を一番良く知っているのはEさんなのですから、
人に聞く前に自分で実行してみて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 先ほどは失礼しました。改めてお願いします。

#8

投稿記事 by softya(ソフト屋) » 14年前

こちらのコードに酷似しているのですが、自分で書かれたものではありませんね?
http://www.orchid.co.jp/computer/cgame/cgm6.html
正直に書いていただかないと我々もサポートしきれません。
それと、元々の「excelで軌跡を描け」と言うテーマがどこかへすっ飛んでます。

自分のできない事、出来る事を明かした上で、現状で出来る限りのものを出してください。

[追記]
配列は、床をバウンドする回数をやろうと考えています。
回数を数えるだけなら、配列は必要ありません。
全てのボールの軌跡(座標)を記録するためには必要で、出来れば構造体配列がベストです。
ボールを壁に向かって投げて、跳ね返りバウンドしなくなるまでの奇跡を求める。(空気抵抗なし)
初速度Vo、壁の反発係数e1、床の反発係数e2、床からボールの高さy、距離x、時間t
跳ね返った時の速度V、投射角度θ、水平方向の速度Vx、鉛直方向の速度Vy、壁に当たった時の時間t’,
数学的には正しいですが、プログラム的にはかえってややこしい事になると思います。
速度はベクトルだけで管理したほうが良いでしょう。

時間がないので、なるべくこの掲示板を訪れてください。
一日1~2回では進むものも進みません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


閉鎖

“C言語何でも質問掲示板” へ戻る