1

2D 空間で指定された点から円の最も遠い点を取得する最良の方法を見つけようとしています。これまでに見つけたのは、点と円の位置の間の距離を取得する方法ですが、これを展開して円の最も遠い点を見つける方法が完全にはわかりません。

既知の変数は次のとおりです。

  • ポイント
  • b点(サークル位置)
  • 半径r(円の半径)

ポイントと円の位置の間の距離を見つけるために、私はこれを見つけました:

xd = x2 - x1

yd = y2 - y1

距離 = 平方根 (xd * xd + yd * yd)

私には思えますが、これは解決策の一部です。これを展開して、下の画像のポイント x の位置を取得するにはどうすればよいでしょうか?

問題はここでグラフィカルに説明されています。 望ましい結果は、点 x の位置です。 質問の追加のオプションの部分として:平方根を使用せずに距離部分を取得できることをいくつかの場所で読みました。これは非常にパフォーマンスが高く、高速なコードが必要な場合は避ける必要があります。私の場合、この計算を頻繁に行っています。主な質問のコンテキスト内でこれに関するコメントも歓迎します。

4

1 に答える 1

6

これはどうですか?

  1. ABを計算します。
    これで、円の中心からAに向かうベクトルができました(Bが原点の場合は、これをスキップして、点Aをベクトルと見なしてください)。
  2. ノーマライズ。これで、明確に定義された長さが得られました(長さは1です)
  3. 円が単位半径でない場合は、半径を掛けます。単位半径の場合はスキップしてください。これで正しい長さになりました。
  4. 符号を反転します(3.を使用して、1つのステップで実行できます。負の半径を乗算するだけです)
    。これで、ベクトルは正しい方向を指します。
  5. Bを追加します(Bが原点の場合は、これをスキップします)。
    これで、ベクトルが正しくオフセットされたので、その端点が目的のポイントになります。

(または、否定を保存するためにBAを計算することもできますが、原点を正しくオフセットするには、もう1つの操作を実行する必要があります。)

ちなみに、3Dでも同じように機能しますが、円が球であり、ベクトルに3つのコンポーネントが含まれます(同種の座標を使用する場合は4つです。この場合、正確さのために、wを0に設定することを忘れないでください)。 「ポイントをベクトルに変換する」場合、およびベクトルからポイントを作成する場合は最後に1になります)。

編集:(
擬似コードの応答で)
ベクトル減算とスカラー乗算の演算子(かなり些細な、約12行のコード)を持つ2つのfloat数の構造体であるvec2クラスと、normalizeそれ以上である必要のない関数があると仮定しますを掛ける略語よりも、inv_sqrt(x*x+y*y)擬似コード(ここでの私の擬似コードはC ++ / GLSLミックスのようなものです)は次のようになります。

vec2 most_distant_on_circle(vec2 const& B, float r, vec2 const& A)
{
    vec2 P(A - B);
    normalize(P);
    return -r * P + B;
}

使用するほとんどの数学ライブラリには、これらすべての関数と型が組み込まれている必要があります。HLSLとGLSLは、それらをファーストタイプのプリミティブおよび組み込み関数として持っています。一部のGPUには、専用の正規化命令もあります。

于 2012-06-11T14:22:45.787 に答える