- ベストアンサー
ベクトルを使った関数
座標を受け取る毎に、前の座標からの方向を判定し、返す関数を作りたいのですが、なかなかうまくいきません。 ベクトルを利用するとよいと言われたのですが、ベクトルの計算式がわからなくて。 わかる方教えてください、お願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
C言語による、「呼ぶ度に、前回呼び出し時と今回呼び出し時の方向ベクタ(2次)を得る」という関数の例です。 struct v { float m_fX, m_fY; // ※ 次数と型は適切な物を選ぶ }; void f( v* o_pV, // 方向ベクタ。偏角が必要ならatan2( o_pV->m_fY, o_pV->m_fX )。 const v* i_pV // 今回ベクタ ){ static v s_vOld; // 前回ベクタ static char s_i1st; // 初回処理フラグ if( s_i1st ){ o_pV->m_fX = i_pV->m_fX - s_vOld.m_fX; o_pV->m_fY = i_pV->m_fY - s_vOld.m_fY; }else{ o_pV->m_fX = o_pV->m_fY = 0.f; s_i1st = 1; } s_vOld.m_fX = i_pV->m_fX; s_vOld.m_fY = i_pV->m_fY; }
その他の回答 (6)
- naru_fumi2005
- ベストアンサー率13% (10/72)
#5の回答について、 > complex型ですが、通常は全てのCには無いと考えた方がいいと思います。 わたしの方でFORTRANと勘違いしていました。 Cには標準でcomplex型はなくて、色んな人が複素数ライブラリの作成方法を紹介していました。
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!
- terra5
- ベストアンサー率34% (574/1662)
単に、前の座標から今の座標までの線分の絶対的な角度を求めたいのでしょうか。 atan,acos等は結果が180度の範囲でしか得られませんので注意。 360度の範囲で角度が欲しい場合はatan2を使います。 現在の座標をx1,y1前の座標をx0,y0とするなら atan2(y1-y0,x1-x0)で求められます。 (結果がラジアンとか、結果の値の範囲とか、x=0,y=0でエラーになるので使う場合はその辺も考えてください。) 考え方としては前の座標から現在の座標へのベクトルを求めてその傾きを求めているのと同じですが、特にベクトルと考えることもないでしょう。 これが、例えば3点で決まる二つの線分の相対的な角度を求めたいという話なら、ベクトルを利用する意味が出てきますが。 それと、complex型ですが、通常は全てのCには無いと考えた方がいいと思います。C++なら話は違ってきますが。 また、この場合だと複素数使うほうがかえって話が複雑になるように思いますが。
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!
- naru_fumi2005
- ベストアンサー率13% (10/72)
この質問から、以下のことがわかります。 1. どのような関数が作りたいのか。 > 座標を受け取る毎に、前の座標からの方向を判定し、返す関数を作りたい 「座標を受け取る」より、現在の座標を受け取ると、と言うこと。 「前の座標からの方向を判定し、返す」より、戻り値は、現在の座標と直前の座標の方向となる。 実際には、現在の座標と直前の座標の差から方向が求まるので、この2つの座標からその方向を返す関数が作りたいと言うことになります。 2. 何がわからないのか。 > ベクトルを利用するとよいと言われたのですが、ベクトルの計算式がわからなくて。 「ベクトルの計算式がわからなくて」より、ベクトルそのものやベクトルに関する計算等、基礎的なことがわからない。 以上のことから、#1の回答を書き込みました。
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
この質問から分かることは、次の2つのことです。 (1) どういう動作をする関数を作りたいのか、質問からは読み取れない。 その関数に座標p1を与えると、何が返るのですか。 その次に座標p2を与えると、何が返るのですか。 さらに座標p3を与えると、何が返るのですか。 そういうことの説明が一切ないので、その関数はどういう動作をして、どういう値を返せばよいのか、回答者側には全く分かりません。 (2) ベクトルの何が分からないのか、質問からは読み取れない。 「ベクトルの計算式がわからない」という表現は次の2通りに解釈でき、そのどちらなのか質問の文章からは分かりません。 A: ベクトルを利用した計算手順ないし計算方法は分かるが、それをプログラムコードにすることができない。 B: ベクトルを利用した計算手順ないし計算方法を考えることができない。(ベクトルをどう使えばよいのかが分からない。) 前者であればプログラミングに関する問題ですが、後者であればプログラミング以前の、数学あるいは算術の問題です。(後者の場合、その数学あるいは算術の問題である部分を抜き出して教育→数学カテゴリで質問されるほうが、このカテゴリよりも適切な回答が得られやすいかと思います。) 質問からは読み取れない以上の不明点を、補足説明で明らかにしていただくことはできますでしょうか。
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ベクトルとか考えなくても、平面の場合は、 x座標の偏差とy座標の偏差で角度を求めるのは簡単だと思います。 (3次元座標の場合は、x-y平面上の方向と仰角(俯角)という形になろうかと思いますがおなじことです) C言語で座標から角度を求める時には、 acosか atan2を使うとやりやすいと思います。
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!
- naru_fumi2005
- ベストアンサー率13% (10/72)
複素数を使えばいいのでは? Cには確か、複素数を表すcomplex型(構造体でtypedefされていた気がする)が用意されていたと思います。 例えば、 今の座標(15,8i)から次の座標(6,22i)に移ったら、 (6,22i) - (15,8i) = (-9,14i) になります。 複素数の大きさは、 |z|=(Re*Re + Im*Im)^(1/2) となり、その方向は、 φ = atan(Im/Re) となります。 (ただし、Reは複素数の実数部、Imは複素数の虚数部。atanは逆正接を表す。) どのような表現を用いても、ベクトルを2次元で扱うので、変数は2つ必要になります。
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!
お礼
遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!