[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 メーリングリストの案内