[SML 7298] はじめまして & Jun に関して質問
shortsleeved
shortsleeved @ mac.com
2007年 4月 18日 (水) 22:11:03 JST
はじめまして、佐藤と申します。
最近、Jun for Smalltalk のコードを勉強させていただいていま
す。
早速ですが、ひとつ質問があります。
Jun740で、以下を do it すると、無限ループしてしまうように
みえます。
----
JunPlane on: 0 , 1 , 1 vertical: (0 , 0 , 0 to: -1 , 0 , 0)
----
コードを追っていくと、#on:vertical: メソッド中の p3
を再計算しいる以下の部分、
-----
p3 := thePoint.
((p1 to: p2) isParallelWithLine: (p1 to: p3))
ifTrue:
[thirdLine := firstLine.
threeAxes := Array
with: (0 , 0 , 0 to: 0 , 0 , 1)
with: (0 , 0 , 0 to: 1 , 0 , 0)
with: (0 , 0 , 0 to: 0 , 1 , 0).
thirdAxis := threeAxes
detect: [:line | (line to = firstAxis to)
not and: [(line to = secondAxis to) not]].
aTransformation := Jun3dTransformation translate:
thirdAxis to.
thePoint := nil.
[thePoint isNil or: [thePoint equal: p2]] whileTrue:
[thirdLine := thirdLine transform: aTransformation.
thePoint := aPlane intersectingPointWithLine:
thirdLine].
p3 := thePoint].
-----
が、おかしいように思われました。文章ではうまく説明しにくいのです
が、ここで、thirdAxis を求める必要はなく、最初の p3
の計算時とは違う方向に移動させれば良いだけだと判断し、上記部分を
以下のように書き換えてみました。
-----
p3 := thePoint.
((p1 to: p2) isParallelWithLine: (p1 to: p3))
ifTrue:
[thirdLine := firstLine.
aTransformation := Jun3dTransformation translate:
firstAxis to.
thePoint := nil.
[thePoint isNil or: [thePoint equal: p2]] whileTrue:
[thirdLine := thirdLine transform: aTransformation.
thePoint := aPlane intersectingPointWithLine:
thirdLine].
p3 := thePoint].
-----
このようにすると、無限ループしなくなったのですが、ここで質問があ
ります。
この修正は、今回のケース "JunPlane on: 0 , 1 , 1 vertical: (0 ,
0 , 0 to: -1 , 0 , 0)" でたまたまうまくいっただけなのでしょう
か、それとも、あらゆるケースで通用するものなのでしょうか。
どなたかご回答いただければ幸いです。
以上、よろしくお願いします。
--
shortsleeved @ mac.com
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://www.akademia.co.jp/pipermail/sml/attachments/20070418/7c3fefbc/attachment.html
SML メーリングリストの案内