ページ 11

ファイルからの値の読み込み

Posted: 2007年10月30日(火) 17:59
by AISU
どうしても解き方の分らない問題があるので教えてください。


矩形AはX軸の+方向に一定の速度で進む
矩形BはX軸の-方向に一定の速度で進む

A,Bの動きをシュミレーションして、毎秒ごとのA,Bの位置と衝突する
秒数を画面に表示させよ。

ただし、各矩形の初期位置及び大きさ、速度はCドライブのtempファイルに記述されているものとし、
ファイルから読み込んで設定できるものとする。
初期位置及び大きさ、速度は任意の値でよい。

何度挑戦してもビルドが通りませんでした。
正解例のコーディングを見て勉強したいとおもいますので、どなたかご教授お願いします。

Re:ファイルからの値の読み込み

Posted: 2007年10月30日(火) 18:27
by バグ
具体的にどのようなエラーが出てビルド出来ないのでしょうか?
また、自分自身、何が分かっていないか言えますか?
それから、最低でも開発環境くらいは書いていただかないと答えようがありません。
最後に、ここの掲示板は、答えを求める場所ではなく、アドバイスを求める場所です。つまり最終的に課題を解くのは、あなた自身だという事を忘れないで下さい。

Re:ファイルからの値の読み込み

Posted: 2007年10月30日(火) 18:46
by tk-xleader
ファイルがバイナリならfopen("ファイル名","rb");で開く、fread()で読み込む。
テキストによるcsvに近いなら
"rb"→"r"として、fscanf()またはfgets→atoiの組み合わせでしょう。

Re:ファイルからの値の読み込み

Posted: 2007年10月30日(火) 18:55
by AISU
正直お手上げですので、質問した次第です。
そういう状況なら丸投げも可と利用規約に書いてありましたので・・・。
tempファイルはメモ帳です。
使用しているコンパイラはVisual C++ 2005 Express Editionで、
使用パソコンのOSはXPです。

Re:ファイルからの値の読み込み

Posted: 2007年10月30日(火) 20:36
by box
> 何度挑戦しても

と書かれていますので、何らかのソースコードは
お手元にありますね?

それを提示してみるお考えはありますか?

Re:ファイルからの値の読み込み

Posted: 2007年10月30日(火) 20:54
by toyo
条件の後出しはだめですよ
できれば課題の文章そのままがいいです
値は任意でよいとしてファイルフォーマットは決まってないのですか?
例えば
AX0,AY0,AX1,AY2,AV,BX0,BY0,BX1,BY1,BV
のように矩形の左上座標、右下座標、速度の順にコンマ区切りの整数とするとか
あと表示する矩形の位置は左上の座標なのか中心の座標なのか
衝突しない場合の処理はどうするのか

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 09:33
by AISU
最初に投稿した記事の問いが課題の文章そのままです。
表示する矩形の位置は中心の座標でいいと思います。
衝突しない場合の処理は考えなくても良いと思われますといいますか、
単純に+方向と-方向に進む2つの物体が衝突しないという事態は考えられるのでしょうか?

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 09:35
by AISU
ファイルフォーマットにつきましても特に指示はありませんでした。
値が読み込めさえすれば良いのだと思います。

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 10:35
by バグ
>>単純に+方向と-方向に進む2つの物体が衝突しないという事態は考えられるのでしょうか?

例えば矩形1がプラス方向、矩形2がマイナス方向に動くとして、矩形2の初期位置の値が、矩形1の初期位置の値よりも小さかった場合ですね。これは絶対に衝突しないですよね?


>>ファイルフォーマットにつきましても特に指示はありませんでした。
>>値が読み込めさえすれば良いのだと思います。

下記のソースは『データを読み込むだけ』のサンプルです。移動・衝突などの処理は一切行っていません。
分からない所があったら、また書き込みしてください(^-^)

#include	<stdio.h>

/* データ格納用構造体 */
typedef struct Temp_Data
{
	float width;		// 矩形幅
	float height;		// 矩形高
	float speed;		// 1sec辺りの移動量
	float postion;		// 矩形
} TEMP_DATA;

/* メイン関数 */
void main(void)
{
	int i, check;
	TEMP_DATA temp[2];
	FILE* pFile;

	/* テキストFileを読み込みモードでオープンする */
	if ((pFile = fopen("temp.txt", "rt")) == NULL)
	{
		/* Fileのオープンに失敗したので終了する */
		printf("File Open NG!!\n");
		return;
	}
	else
	{
		printf("File Open OK!!\n");
	}

	/* Fileデータの読み込み */
	for (i = 0; i < 2; i++)
	{
		/* データ読み込み */
		check = fscanf(pFile, "%f,%f,%f,%f", &temp.width, &temp.height, &temp.speed, &temp.postion);

		/* データ読み込みのエラーチェック */
		if (check == 0 || check == EOF)
		{
			/* データの読み込みに失敗したので終了する */
			printf("File Read NG!!\n");
			return;
		}
		else
		{
			printf("TempData %d Read OK!!\n", i + 1);
		}
	}

	/* 読み込んだデータの表示 */
	for (i = 0; i < 2; i++)
	{
		printf("幅 = %f, 高 = %f, 速 = %f, 位置 = %f\n", temp.width, temp.height, temp.speed, temp.postion);
	}

}

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 10:51
by AISU
回答ありがとうございます。
しかし、ファイルの読み込みの所はなんとか自分でも理解はできていました。
私がお聞きしたかったのは移動・衝突などの処理のロジックです;;
申し訳ございませんが、引き続きご教授願えたら幸いです。

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 11:26
by バグ
既にtoyoさんが書き込みしていますが、矩形の何処を基準にすれば良いのでしょうか?
矩形①         矩形②
A┏━━━━━━━━┓D E┏━━━━━━━━┓H
 ┃        ┃   ┃        ┃
 ┃        ┃   ┃        ┃
B┗━━━━━━━━┛C F┗━━━━━━━━┛G
例えば上記の用な矩形があったとして、矩形①の初期位置の座標というのを、Aを基準にするのか、Dを基準にするのか、はたまたAとDの中間地点とするのかで判定基準が変わってきますので、任意だと言われるのならば、その辺りをあらかじめ自分で決めておいていただかねばなりません。

仮に矩形①をA、矩形②をEの位置を初期位置とした場合の衝突判定を説明します。

このときの衝突したと判断する条件は、D値がE値よりも大きくなった場合(もしくはE値がD値よりも小さくなった場合…って、当然ですね(汗))となるのは分かりますか?

この条件が満たされているかを調べる為には、それぞれの矩形のN秒後の位置を求める必要があります。

《 初期位置 + 1秒辺りの移動量 × 移動開始からの経過時間(秒) 》

それは上記の式で求まります。

しかしこれはあくまでもA値とE値であって、今回必要なのはD値とE値の比較値な訳です。そこで、A値に矩形の幅を足してやる事でD値を求めてやる訳です。

これで、条件を判断するのに必要な条件は揃いましたよね?
あとはD値とE値を比較すればよいだけです。説明がくどくなってしまいましたが、分かってもらえましたか?

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 12:52
by AISU
丁寧なご説明誠に感謝いたします。
説明も理解できて、納得もできるのですが、
そこまでは、私も考えついておりました;;
わからないのは、それをソース上で表すにはどうすればよいか?
ということに尽きます。
初期位置については、バグ様の仮設定通り、
矩形①をA、矩形②をEで構いませんので、
お手数おかけしますが、引き続きご教授願えないでしょうか?

Re:ファイルからの値の読み込み

Posted: 2007年10月31日(水) 13:33
by バグ
まず、今回の処理にあらかじめ必要なデータを考えてみて下さい。
これは上記の説明を読んでもらえばすぐに分かると思います。

①:矩形の位置
②:矩形の幅
③:矩形の1秒辺りの移動量

…の3つですよね。この3つのデータが各矩形ごとに必要となります。
ここまでが私が前に載せたデータ読み込みの部分です。


次の段階は、矩形①と矩形②を移動させて、衝突するまで繰り返すことになります。

①:時間のカウントを1秒進める
②:矩形①の現在位置を計算して、画面に表示する
③:矩形②の現在位置を計算して、画面に表示する
④:衝突していたら⑤へ、そうでなければ①へ戻る
⑤:衝突した時点の時間を画面に表示して終了

という流れになります。
前述のファイル読み込みのソースが理解できるならば、充分に組めると思いますよ。

頑張って下さい♪