これはどうですか?
- ABを計算します。
これで、円の中心からAに向かうベクトルができました(Bが原点の場合は、これをスキップして、点Aをベクトルと見なしてください)。
- ノーマライズ。これで、明確に定義された長さが得られました(長さは1です)
- 円が単位半径でない場合は、半径を掛けます。単位半径の場合はスキップしてください。これで正しい長さになりました。
- 符号を反転します(3.を使用して、1つのステップで実行できます。負の半径を乗算するだけです)
。これで、ベクトルは正しい方向を指します。
- 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には、専用の正規化命令もあります。