• 締切済み

C言語の課題

何度も申し訳ありません http://okwave.jp/qa/q7877142.html より、回答を受けてプログラムを作成したのですが、 衝突時の時間と座標をどのように作成すれば良いか分からなく、 一秒後の点Pの位置を算出したのですが、合っているかどうかが分かりません。 非常に難しくで困っています。お助け下さい。 ソースコード #include <stdio.h> #include<math.h> int main(void) { float p,v,vx,vy,x,y,x1,y1,katamuki,gyaku,seiki_x,seiki_y,n,touei_x,touei_y,idoux,idouy,px,py; /* p=(x,y); v=(vx,vy); */ x=1.0; y=1.0; vx=1.0; //x方向の速さ vy=-2.0; //y方向の速さ y1=-x; //逆数 x1=-y; //逆数 printf("逆数は(x1,y1)=(%f,%f)\n",x1,y1); seiki_x=x1/(sqrt(x1*x1+y1*y1)); seiki_y=y1/(sqrt(x1*x1+y1*y1)); printf("正規化、(x方向,y方向)=(%f,%f)\n",seiki_x,seiki_y); n=-(vx*seiki_x)+(vy*seiki_y); //nは内積 touei_x=n*seiki_x; //touei_xは投影x軸 touei_y=n*seiki_y; //touei_yは投影y軸 printf("投影ベクトル(x,y)=(%f,%f)\n",touei_x,touei_y); idoux=vx+2*touei_x; //衝突後、点Pのxの移動方向 idouy=vy+2*touei_y; //衝突後、点Pのyの移動方向 px=-idoux; //点Pのx座標 py=-idouy; //点Pのy座標 printf("1秒後の位置は点P(x,y)=(%f,%f)",px,py); return 0; } /* 逆数は(x1,y1)=(-1.000000,-1.000000) 正規化、(x方向,y方向)=(-0.707107,-0.707107) 投影ベクトル(x,y)=(-1.500000,-1.500000) 1秒後の位置は点P(x,y)=(2.000000,5.000000) */

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>壁の法線ベクトルNを求めるには、壁の傾きの逆数を求めます。 壁の傾きの逆数『の符号を反転した数』が正しいでしょうね。 傾きの積が-1になることを利用しているのであれば。 >例えば、傾きが「-3/4」であった場合には「4/3」が逆数になります。 -3/4 の逆数は -4/3 以外にはありません。 逆数を求める際、正負の符号を勝手に取り払ってはいけません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>x=1.0; >y=1.0; >y1=-x; //逆数 >x1=-y; //逆数 下の2行は、実際に行なっていることとコメントが食い違っています。 逆数というのは、1/xや1/yのことです。 本当に実行したいのは、逆数を得ることでしょうか。それとも、 今のコードのように、正負を反転した数を得ることでしょうか。

makorin0727
質問者

補足

http://www5f.biglobe.ne.jp/~kenmo/program/buturi5/buturi5.html#3 より、 1.まず、壁の法線ベクトルNを求めます。 法線ベクトルとは、あるベクトルに直角に交わるベクトルのことを言います。 壁の法線ベクトルNを求めるには、壁の傾きの逆数を求めます。 例えば、傾きが「-3/4」であった場合には「4/3」が逆数になります。 (逆数は「元の数×逆数=-1」という式を利用します) そして、逆数の傾きとなるようなベクトルを求めます。 (x, y)=(4, 3)だと逆方向なので、(x, y)=(-4, -3)になります。 と書いてあったので・・・

関連するQ&A