[SML 7301] Re: はじめまして & Jun に関して質問

"佐藤 隆志" shortsleeved @ mac.com
2007年 4月 19日 (木) 14:38:59 JST


 佐藤です。

フォローアップありがとうございます。
なかなか簡単にはいかない問題だったようですね。

教えていただいたコードを私なりに読み解いてみました。

>| thePoint theLine p1 p2 line angle p plane p3 |
>thePoint := 0 , 1 , 1.
>theLine := 0 , 0 , 0 to: -1 , 0 , 0.
>p1 := thePoint.
>p2 := theLine nearestPointFromPoint: p1.
>line := p1 to: p2.

p1を通りtheLineと直行する直線(line)と、その直線とtheLineとの交点(p2)を求める。

>angle := 90 asDegrees.
>(theLine first distance: p2) > (theLine last distance: p2)
>     ifTrue: [p := theLine first]
>     ifFalse: [p := theLine last].

theLine の両端点のうち、p2からの距離が遠いほうを求める(p)。これはp2=pとなるのを避けるため(だと思います)。

>plane := JunPlane
>             on: p1
>             on: p2
>             on: p.

p1,p2,pで平面(plane)を生成。
この平面はthePoint,theLineで表される平面と直行する。

>plane := plane transform: (angle transformationToRotate: line).

lineを軸にして、planeを90度回転させる。原理的には、これが求める平面(というかp3が決定できた平面)。

>((plane translatedBy: theLine first - p2) whichSide: theLine last) > 0
>     ifFalse:
>         [plane := JunPlane
>                     on: p2
>                     on: p1
>                     on: p.
>         plane := plane transform: (angle transformationToRotate: line)].

表裏がひっくり返っている(法線ベクトルの向きが逆になっている)可能性があるので、その場合はp2,p1の順番を入れ替えて平面を作りなおす。

一点だけ気になることがあります。
教えていただいたコードの場合、thePoint が theLine 上にある場合についての考慮が必要になるかと思います。
例えば、以下のような場合です。

thePoint := 0 , 0 , 0.
theLine := 0 , 0 , 0 to: -1 , 0 , 0.

これをどうするかは、今、ちょっと頭の中がいっぱいになってしまっているので、後で考えたいと思います。
また、質問するかもしれませんが、よろしくお願いします。




SML メーリングリストの案内