2つの接続されたラインセグメントのちょうど中間にある単位ベクトルを見つける


8

素早く簡単な質問のようですが、私が探しているものを正確に見つけることができませんでした:

2つの接続されたラインセグメントの角度のちょうど50%であるラインに沿って指している単位長ベクトルを計算する方法は?

画像は何千もの言葉を話します(これは私の説明よりも優れています!) 2つの接続された線分を二分する単位ベクトルの例
基本的に、2つの赤い線分(実際には3つの点であり、したがって接続が保証されている)を前提として、青い単位ベクトルを計算します。

赤いセグメントは任意の長さであり、結果は単位である必要はありません。
結果のベクトルを特定の方向(入力セグメントに対して)にポイントさせる方法があると便利です。これは、これを解決できると思うので、必須ではありません-入力ラインセグメントが最終的に形成されるためです。 nゴン。

どんな例でもC ++では理想的ですが、他の言語も歓迎します。

ポインタに感謝します。

回答:


13

赤いセグメントから2つのベクトルを作成し、それらの共通頂点から開始して正規化し、結果を(コンポーネントごとに)追加します。その後、単位ベクトルを取得する場合は、出力を正規化できます。

2つのベクトル間の角度は常に180°未満になるため、問題は常に2番目のケースになるということです。しかし、もちろん、反対のベクトルを作成して、どちらがあなたの目的により適しているかを見ることができます。

また、両方のベクトルが整列し、平均が0になる特別なケースもあります(ただし、簡単に検出できます)。


これはまさに私が探しているものだと思います!私はそれが簡単に知っていた:)私はちょうど私が何を得る他の回答を参照して開いたままにしておきましょう...おかげ
アダム・ネイラー

以前にこの単純な方法を使用したことがあるにもかかわらず、ドット積を含むより複雑な方法を記述しようとしていました、ド!
CiscoIPPhone 2011

「問題は、常に2番目のケースになる」とはどういう意味ですか?
CiscoIPPhone 2011

@CiscoIPPhone彼は私の図を参照していると思います。ドットプロダクトソリューションは、少なくともCiscoIPPhoneを歓迎する以上のものです。少なくとも、私はそれに+1を付けます:)
Adam Naylor

確かに私はあなたのイメージを参照していました。内積を使用すると、2つのベクトル間の角度を取得できますが、180°未満にとどまります。
XGouchet

1

これを2D頂点法線を生成しているように扱うことで、方向を一貫させることができると思います。あれは:

  1. 赤いベクトルをそれぞれ取り、xとyのコンポーネントを交換し、それらの1つを無効にして法線を作成します。

  2. それらを正規化します。

  3. これら2つのベクトルを合計し、再正規化します。

また、2つの赤い線が互いに重なっている場合もテストする必要があります。最終的な再正規化では、そこでゼロで除算しようとします。


アダムに感謝します。このアプローチには名前がありますか?さらに詳しく調べたいのですが...
アダムネイラー

私が知っていることではありません。通常のベクトル生成のトリックは、stackoverflow.com
Adam

0

AとBをベクトルにします。

結果

| A |の場合、合計ベクトルは単位ベクトルである必要はなく、単に長さが等しい必要があります。> = | B |、次のことができます:

同等の結果

分数と分母が大きいだけなので、数値的に安定しています。

合計のしくみ

減算でも同じ結果が得られますが、ここでもベクトルの長さは同じでなければなりません。

これは、非凸角度でのみ機能します。角度が凸かどうかを簡単にテストし、Hを-1で乗算できます


| A |の場合、これでうまくいくとは思いません。!= | B | ... A = [0,1] B = [100,0]と考えてください。結果は[.707、.707]ではありません
Richard Fabian

@リチャードファビアンあなたは正しいです、私は三角形の不等式を忘れました!
FxIII
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.