線分 AB が与えられると、有名な中点の公式 を使用して中点、たとえばM(A + B)/2
を見つけることができます。BからAへのベクトルを計算します。
p = <px, py> = A ‒ B
原点を中心に反時計回りに 90° 回転させて垂直ベクトルを取得します。
n = <nx, ny> = < ‒ py, px >
それを正規化します。
n = <nx, ny> / ‖n‖ ここで、‖n‖ = √(n.x² + n.y²) はユークリッド ノルムまたは長さです。
C = L(t) = M + t n
この方程式 (線のパラメトリック形式) を使用すると、垂線に沿って ( nの方向に) 任意の数の点を見つけることができます。は、取得したポイントCのMからt
の距離です。の場合、Mが返され、 の場合、 nに沿ってMから 1 単位離れた点が得られます。これは の負の値に対しても機能し、得られるポイントは AB の反対側、つまり音符の方向になります。は 10 進数になる可能性があるため、その値を変更してMから取得したポイントの目的の距離と方向を取得することで、それを操作できます。t = 0
t = 1
t
t
コード、数学の専門用語には興味がないと言ったので ;)
vec2d calculate_perp_point(vec2d A, vec2d B, float distance)
{
vec2d M = (A + B) / 2;
vec2d p = A - B;
vec2d n = (-p.y, p.x);
int norm_length = sqrt((n.x * n.x) + (n.y * n.y));
n.x /= norm_length;
n.y /= norm_length;
return (M + (distance * n));
}
プロジェクトで使用しているベクトル数学ライブラリがわからないため、これは単なる疑似コードです。
上記の太字の変数は 2 次元ベクトルです。大文字は点を表し、小文字は位置のないベクトルを表します