• ベストアンサー

ベクトルを使った関数

座標を受け取る毎に、前の座標からの方向を判定し、返す関数を作りたいのですが、なかなかうまくいきません。 ベクトルを利用するとよいと言われたのですが、ベクトルの計算式がわからなくて。 わかる方教えてください、お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rigidbody
  • ベストアンサー率60% (20/33)
回答No.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; }

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

その他の回答 (6)

回答No.6

#5の回答について、 > complex型ですが、通常は全てのCには無いと考えた方がいいと思います。 わたしの方でFORTRANと勘違いしていました。 Cには標準でcomplex型はなくて、色んな人が複素数ライブラリの作成方法を紹介していました。

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.5

単に、前の座標から今の座標までの線分の絶対的な角度を求めたいのでしょうか。 atan,acos等は結果が180度の範囲でしか得られませんので注意。 360度の範囲で角度が欲しい場合はatan2を使います。 現在の座標をx1,y1前の座標をx0,y0とするなら atan2(y1-y0,x1-x0)で求められます。 (結果がラジアンとか、結果の値の範囲とか、x=0,y=0でエラーになるので使う場合はその辺も考えてください。) 考え方としては前の座標から現在の座標へのベクトルを求めてその傾きを求めているのと同じですが、特にベクトルと考えることもないでしょう。 これが、例えば3点で決まる二つの線分の相対的な角度を求めたいという話なら、ベクトルを利用する意味が出てきますが。 それと、complex型ですが、通常は全てのCには無いと考えた方がいいと思います。C++なら話は違ってきますが。 また、この場合だと複素数使うほうがかえって話が複雑になるように思いますが。

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

回答No.4

この質問から、以下のことがわかります。 1. どのような関数が作りたいのか。 > 座標を受け取る毎に、前の座標からの方向を判定し、返す関数を作りたい 「座標を受け取る」より、現在の座標を受け取ると、と言うこと。 「前の座標からの方向を判定し、返す」より、戻り値は、現在の座標と直前の座標の方向となる。 実際には、現在の座標と直前の座標の差から方向が求まるので、この2つの座標からその方向を返す関数が作りたいと言うことになります。 2. 何がわからないのか。 > ベクトルを利用するとよいと言われたのですが、ベクトルの計算式がわからなくて。 「ベクトルの計算式がわからなくて」より、ベクトルそのものやベクトルに関する計算等、基礎的なことがわからない。 以上のことから、#1の回答を書き込みました。

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

この質問から分かることは、次の2つのことです。 (1) どういう動作をする関数を作りたいのか、質問からは読み取れない。 その関数に座標p1を与えると、何が返るのですか。 その次に座標p2を与えると、何が返るのですか。 さらに座標p3を与えると、何が返るのですか。 そういうことの説明が一切ないので、その関数はどういう動作をして、どういう値を返せばよいのか、回答者側には全く分かりません。 (2) ベクトルの何が分からないのか、質問からは読み取れない。 「ベクトルの計算式がわからない」という表現は次の2通りに解釈でき、そのどちらなのか質問の文章からは分かりません。 A: ベクトルを利用した計算手順ないし計算方法は分かるが、それをプログラムコードにすることができない。 B: ベクトルを利用した計算手順ないし計算方法を考えることができない。(ベクトルをどう使えばよいのかが分からない。) 前者であればプログラミングに関する問題ですが、後者であればプログラミング以前の、数学あるいは算術の問題です。(後者の場合、その数学あるいは算術の問題である部分を抜き出して教育→数学カテゴリで質問されるほうが、このカテゴリよりも適切な回答が得られやすいかと思います。) 質問からは読み取れない以上の不明点を、補足説明で明らかにしていただくことはできますでしょうか。

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

ベクトルとか考えなくても、平面の場合は、 x座標の偏差とy座標の偏差で角度を求めるのは簡単だと思います。 (3次元座標の場合は、x-y平面上の方向と仰角(俯角)という形になろうかと思いますがおなじことです) C言語で座標から角度を求める時には、 acosか atan2を使うとやりやすいと思います。

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

回答No.1

複素数を使えばいいのでは? 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つ必要になります。

MIZU0910
質問者

お礼

遅くなってすいません! ネカフェでサイトを見てるもので。 アドバイスありがとうございます!!

関連するQ&A

  • ベクトルについて

    高校物理の学習をしていたのですが、 → F=(-kx,0)というベクトルが出てきて、 このベクトルは一体何なのか分かりません。 x座標が-kxということで、x=-kxということになり、何が何だか 分かりません。前に同じような質問をして、 x=-kxではなく、Fx=-kxであるという回答をいただいたのですが、 どうも釈然としません。-kxはx座標上の成分ではなく、Fx座標上の成分 ということでしょうか?しかし、仕事を計算する際、x座標 方向の微小距離dxを-kxにかけるので、-kxはx座標上の成分である という解釈をせざるを得ないと思います。 また、図示すれば一体どのようになるのでしょうか? → F=(x,-kx)なら、図示できて、どんなベクトルか 理解できるんですけど…

  • ベクトル関数と関数ベクトル

    の違いについて教えてください ベクトル関数とはどういうもので 関数ベクトルとはどういうものでしょうか? またベクトル信号と信号ベクトルの違いも教えてください

  • 一本のベクトルに直交するベクトルについて

    あじぽんと申します。質問があります。 3次元空間にベクトルAが一本だけあるとします。 さらにベクトルAに直交するベクトルがいくつもあるとします。 ベクトルAの座標がわかっている時に、 ベクトルAに直交するベクトルの座標を、どれか一つだけ計算にて求めることは出来るのでしょうか? よろしくお願いします。

  • 距離とベクトル

    原点(0, 0, 0) から 無限遠に伸ばす方向を示すベクトル(0.2, -0.1, 0.7) ※横・縦・奥行き順 が有るのですが、 その途中の距離4.8 の座標xyzを求めるには どう計算すれば良いでしょうか?

  • ベクトル

    力学の最初の方でならうベクトルなんですがカテゴリーが違ってたらすみません。。 ベクトルA、Bはでデカルト座標系での成分がA:(2、-2、0)B:(1,1,-1)である。 AとBに直交する方向の単位ベクトルを求めよ という問題なんですが、全然分からなくてどのように考えればいいかだけでも教えて下さい。

  • 位置ベクトルの考え方

    位置ベクトルの考え方でよく分からない点があります。 例えば点O(0,0)を原点とする座標平面があって、点A(2,2)はOからx軸方向へ2、y軸方向へ2移動したものです。 ベクトルは向きと大きさで定義されますよね。 なので座標を定めるという行為は、向きと大きさを決めるということだと思っています。 (x,y軸方向へどれくらい動かすかを決めると、自動的にOからどの方向にどれくらいの大きさの矢印が伸びるかが決まるから) これがベクトルを定めると(x,y軸方向へどれくらい動かすかを決めて向きと大きさを決めると)、点の位置が定まる(座標が決まる)ということですよね? また、始点は原点ではなくてもいいんですよね? ということは点X(1,1)を始点として、点A(2、2)は始点Xからx軸方向へ1、y軸方向へ1移動した点、つまり点Xに関する点Aの位置ベクトルと考えていいということでしょうか? もしこうでない場合、どう考えるのでしょう? 質問の要点は、 (1)私の位置ベクトルの解釈の正しさ(おかしい部分があれば指摘していただけるととても嬉しいです) (2)始点の取り方について この2つです。 よろしくお願いします!

  • 大学入試(群馬大)ベクトル・三角関数について

    大学入試(群馬大)ベクトル・三角関数について  下記問題について  座標平面上の2点を   A(sinθ,cosθ)   B((√3)×sinθ-cosθ,sinθ+(√3)×cosθ)  とする。  Oを原点とするとき、  (1) ベクトルOBの大きさ  (2) θ=45°のとき、∠AOBの大きさ  のうち、(1)の以下の内容について、アドバイスいただける  と助かります。  (私の思考)   ○ ベクトルOBの大きさを求めるためにまずは、三角関数の種類を    1つにしたい  ↓  ○ 合成公式により、sin型を検討するが位相が異なってしまう  ↓  ○ 次にcos型でするがまた位相が異なってしまう  ↓  ○(ん~ん、困った・・・)     解答としては、  x=-1×cosθ+(√3)×sinθ  =2cos(120°-θ)  y=-(-1)sinθ+(√3)×cosθ=2sin(120°-θ)  としてから、ベクトルの大きさを求めているのですが、位相  を(120°-θ)とすることに何をもってそうしようとした  のかよくわかっておりません。  ヒントとして「行列を利用するとわかる」とは書いてあるのですが、  なかなかその利用法がわかりません。  いろいろと考えたのですが、どうもたどり着いておりません。  以上の内容について、お分かりになる方がいらっしゃいましたら  お手数をおかけしますが、教えていただけないでしょうか。    よろしくお願いします。  

  • 三次元極座標の位置ベクトルに垂直な速度ベクトル

    三次元極座標で、座標R(r,θ,φ)に質点があり、位置ベクトルに対して垂直な質点の速度ベクトルVの表記がわかりません。 わかる方がいらっしいましたらお願いします。 速度ベクトルの大きさはVで、位置ベクトルに対して垂直であれば方向はランダムです。 私は、位置ベクトルに対して垂直な半径Vの円を考えて円上でのVを(V,θ2)としてそれを表記しなおそうとしたのですがわからなくなりました。 最終的な表記は極座標でもデカルト座標でもかまいません。 お願いいたします。

  • ベクトル…

    ベクトル… 2点A(-4,1,1)、B(0,7,1)を通る直線l上の点において、pと点C(1,2,0)を結ぶ直線mと直線lが直交するという。Pの座標を求めなさい。                                 <答>P(-2,4,1) という問題が解けません; ベクトルCP=ベクトルCA+m×ベクトルAB として計算し始めたのですが、そこからの計算が間違っているのか、そもそも考え方が違うのか、何度やっても正解に辿りつけません。 どなたか分かりやすくお願い致しますm(_ _)m また、点Cは(0,0,0)に平行移動した方が解きやすいのでしょうか?

  • ベクトルの定義について教えてください

     最近ベクトルの定義を見直しているのですが、「座標回転に際して座標変数と同じように変換される三つの量」や「直交座標の座標軸間の角度を直角に保ったまま、原点を変えないで方向だけを変える変換(直交変換)の規則に従って変換される量」という定義がよくわかりません。R^3に限って考えて、具体的にどうわからないのかというと 1.座標回転に際してR^3の要素(まだベクトルかわからない)の変換をどう施すか。または、ベクトルの定義以前に座標回転に対するR^3の要素の変換を定める必要があるのではないか。 2.R^3の要素でありながらベクトルとは認められないもがあるのか。あるとしたらどう示すか。  自分の誤解かもしれませんが、R^3の要素がベクトルかどうかを判断するには、R^3の座標回転による変換とR^3に回転行列の要素をそれぞれかけて足し合わせたものが一致するかを確かめるとすると、R^3が座標回転に際してどう変換されるかを定める必要があると思うのです。どなたかご教授お願いします。