点 P から線分 AB への垂線の足 H を求めます。
Ruby の標準添付ライブラリ 'Matrix' を使います。コード。
require 'matrix' def perpendicular_foot(a, b, p) s = Rational((p - a).dot(b - a), (b - a).dot(b - a)) [h = a + (b - a) * s, s, (h - p).norm] end
点 A, B, P は Vector[]
で指定します。こんな感じ。
$ pry [7] pry(main)> a = Vector[-2, 0] => Vector[-2, 0] [8] pry(main)> b = Vector[1, 3] => Vector[1, 3] [9] pry(main)> p = Vector[0, 0] => Vector[0, 0] [10] pry(main)> perpendicular_foot(a, b, p) => [Vector[(-1/1), (1/1)], (1/3), 1.4142135623730951]
配列が返ります。順に、点 H を表す Vector、H の AB上での位置 s (H = A のとき 0、H = B のとき 1)、PH の長さを表わします。s が 0 と 1 の間にない場合は、H は線分上にはありません(もちろん直線 AB 上にはあります)。
なお、これは何次元でも使えます。