「2点を通る直線から離れた位置にある点までの距離を求める」をSqueak Smalltalkで

| a b c u v L |
a := 2@2.
b := 6@4.
c := 4@5.
u := b - a.
v := c - a.
L := (u crossProduct: v) / v r.
L "=> 2.218800784900917 "


つらつら Point クラスを眺めていたら #nearestPointOnLineFrom:to: 、#dist: なんて便利メソッドも見つかった。

余談ですが、#dotProduct: はあるくせになぜか #crossProduct: がない VisualWorks もこの #nearestPointOnLineFrom:to: や #dist: は使える。ので、先のコードは VisualWorks では動かないけれど、こちらのコードなら試せます。

| a b c p L |
a := 2@2.
b := 6@4.
c := 4@5.
p := c nearestPointOnLineFrom: a to: b.
L := c dist: p.
L "=> 1.788854381999832 "


ただ、返される値が違うようなので先のコードも正しくはこうじゃないかと。

| a b c u v L |
a := 2@2.
b := 6@4.
c := 4@5.
u := b - a.
v := c - a.
L := (u crossProduct: v) / u r.
L "=> 1.788854381999832 "