プロが教える店舗&オフィスのセキュリティ対策術

何度も申し訳ありません
http://oshiete.goo.ne.jp/qa/7877142.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)
*/

A 回答 (2件)

>壁の法線ベクトルNを求めるには、壁の傾きの逆数を求めます。



壁の傾きの逆数『の符号を反転した数』が正しいでしょうね。
傾きの積が-1になることを利用しているのであれば。

>例えば、傾きが「-3/4」であった場合には「4/3」が逆数になります。

-3/4 の逆数は -4/3 以外にはありません。
逆数を求める際、正負の符号を勝手に取り払ってはいけません。
    • good
    • 0

>x=1.0;


>y=1.0;
>y1=-x; //逆数
>x1=-y; //逆数

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

この回答への補足

http://www5f.biglobe.ne.jp/~kenmo/program/buturi …
より、

1.まず、壁の法線ベクトルNを求めます。
法線ベクトルとは、あるベクトルに直角に交わるベクトルのことを言います。

壁の法線ベクトルNを求めるには、壁の傾きの逆数を求めます。
例えば、傾きが「-3/4」であった場合には「4/3」が逆数になります。
(逆数は「元の数×逆数=-1」という式を利用します)
そして、逆数の傾きとなるようなベクトルを求めます。
(x, y)=(4, 3)だと逆方向なので、(x, y)=(-4, -3)になります。

と書いてあったので・・・

補足日時:2013/01/06 22:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!