アプリ版:「スタンプのみでお礼する」機能のリリースについて

まず画像を見ていただきたいのですが‥
①のように長さも向きも決まっていない2つのベクトルがあり、②のように2つのベクトルのなす角を二等分する青いベクトルを求めて、③青いベクトルがX軸のプラス方向から何度の開きがあるかを求めたいのですが、どのように計算すれば良いでしょうか?

C#で求めようとしていますが、考え方の提示だけで問題ありません。
また、私が数学で理解しているのはベクトル・三角関数・内積・ラジアンあたりまでになります。

ちなみに私は最初、2つのベクトルを正規化してから足すことで青いベクトルを求めて、次にX軸に沿った X=1, Y=0 のベクトルと青いベクトルを正規化したものとでアークコサイン関数を使ってなす角を求めようとしました。
しかし最初の2つのベクトルが180度の開きになっていると結果がおかしくなります。
そこで、条件分岐で180度の開きになった時だけ独自にベクトルを求めようとしているのですが、計算が冗長な感じがしています。
求め方としてこれらの考え方は間違っていないでしょうか?

ちなみに②の二等分するベクトルは2方向存在しますが、Y軸のプラス方向を向くベクトルを必ず取得したいです。

「C# 2つのベクトルのなす角を二等分する」の質問画像

質問者からの補足コメント

  • >ちなみに②の二等分するベクトルは2方向存在しますが、Y軸のプラス方向を向くベクトルを必ず取得したいです。

    こちらに関しては、③で求めた角度がマイナスになっていれば180度分加えてやればOKですね。。

      補足日時:2019/01/04 20:06

A 回答 (3件)

そうそう, C# なら Math.Atan2 を使えば「x軸となす角」が一発で求まるよ. 正規化しなくていいし角度の範囲も -π

π までちゃんと求まるので簡単.
    • good
    • 0
この回答へのお礼

Tacosanさん

ご回答ありがとうございます!
はい、まさに私もAtan2で取得するのを試してうまくいきました!
実はエクセルで計算が合ってるか試してみた際にはACOSですんなりうまくいったのですが、C#のMath.Acosでは同じ結果にならずそのままではうまくいかなかったためAtan2で求めていけました。

ついでに言えば、エクセルのAtan2は引数が(x, y)のようですがC#は(y, x)のようで、こちらも結果が噛み合わずにしばらく混乱したのですが、引数が逆だと気付いて事なきを得ました。。

お礼日時:2019/01/06 02:11

ぎりぎりの条件では「Y軸のプラス方向を向くベクトル」が存在しないこともあるんだけど, それは OK?

    • good
    • 0
この回答へのお礼

Tacosanさん

確かに、Y軸に沿ったベクトルの場合にその条件を満たしますね‥
ですが私の今実装したいと思っている場面ではその条件にはならないので、OKです!

お礼日時:2019/01/05 00:36

二つのベクトルをVa(xa,ya), Vb(xb,yb)とすると



各々のベクトルがX軸と成す角度θa, θbは
θa = arccos(xa/|Va|)  |Va| = √(xa^2+ya^2)
θb = arccos(xb/|Vb|)

従って求める角度は、(θb - θa)/2 + θa
    • good
    • 0
この回答へのお礼

>siffon9さん

早速のご回答ありがとうございます!
そうか、2つのベクトルそれぞれでX軸とのなす角を求める方がスマートだったのですね!

アークコサイン関数で求めるとベクトルが -1, -1 でも -1, 1 でも成す角度が同じ 2.356194 になってしまいますが、Yがマイナスかプラスかで判定して条件分岐してやれば求められそうです!

お礼日時:2019/01/05 00:34

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