点と線分との位置関係の測定
点Pと線分fとの位置関係を特定するために有用な測定値と、それをGeoGebraで表現する際の数式の書き方を紹介します。
なお、関連記事として、下記記事もご参照下さい。
AffineRatioとDilateを拡張する - うしブログ
水平方向の位置関係
点Pと線分fとの、水平方向の位置関係を表現する値としては、線分fの端点Point[f,0]およびPoint[f,1]における、点Pからf(またはそれを延長した直線)に下ろした垂線の足(「点H」と呼ぶことにします)のアフィン比が有用です。
AffineRatio[Point[f, 0], Point[f, 1], Intersect[PerpendicularLine[P, f], Line[Point[f, 0], Point[f, 1]]]]
この測定値は実数であり、点Hの位置に応じて、以下の値をとります。
点Hがf(端点を除く)上にあるとき:0より大きく1未満
点Hが端点Point[f,0]にあるとき:0
点Hが端点Point[f,1]にあるとき:1
点Hが、fを端点Point[f,0]側に延ばした半直線(端点Point[f,0]を除く)上にあるとき:負の実数
点Hが、fを端点Point[f,1]側に延ばした半直線(端点Point[f,1]を除く)上にあるとき:1より大きい実数
垂直方向の位置関係
点Pと線分fとの、垂直方向の位置関係を表現する値としては、線分fの端点Point[f,0]を始点、Point[f,1]を終点とするベクトルと、点Hを始点、点Pを終点とするベクトルの外積のz座標の値*1が有用です。以下の数式では、fの長さに依存しない値にするために、最後にDistance[Point[f, 0], Point[f, 1]]で割っています。
Vector[Point[f, 0], Point[f, 1]] ⊗ Vector[Intersect[PerpendicularLine[P, f], Line[Point[f, 0], Point[f, 1]]], P] / Distance[Point[f, 0], Point[f, 1]]
この測定値は実数であり、点Pとfとの距離(点Pがfのどちら側にあるかによって、正負が区別されます)を表します。
オリジナルツール「SegmentCoords」
上記測定値を取得するオリジナルツールです。
構文は、
SegmentCoords[ <点>, <線分> ]
です。戻り値は点オブジェクトであり、そのx座標が水平方向、y座標が垂直方向の位置関係を、それぞれ表現します。
中身は、点をP、線分をfとすれば
(AffineRatio[Point[f, 0], Point[f, 1], Intersect[PerpendicularLine[P, f], Line[Point[f, 0], Point[f, 1]]]], Vector[Point[f, 0], Point[f, 1]] ⊗ Vector[Intersect[PerpendicularLine[P, f], Line[Point[f, 0], Point[f, 1]]], P] / Distance[Point[f, 0], Point[f, 1]])
です。