うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

点と線分との位置関係の測定

点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」

https://ggbm.at/ndymq85c 

上記測定値を取得するオリジナルツールです。

構文は、

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]])

です。

*1:GeoGebraでは、演算子「⊗」によって計算可能です。

https://wiki.geogebra.org/en/Points_and_Vectors