|
|
|
1)Lisajous1 3 4
2)Lisajous1 4 3
直交する2つの単振動の合成で出来るリサージュ曲線です。
縦方向と横方向で、振幅 amp は同じでも振動数
omega.x omega.y
の異なった振り子運動をしている点の軌跡を描いています。
振幅や振動数を、色々変更してバリエーションを楽しんで下さい。
to msgn :num output * -1 :num end to line :x1 :y1 :x2 :y2 penup setxy sentence :x1 :y1 pendown setxy sentence :x2 :y2 end to sample23_function :omega :dth :a :i ; Amplitude modulate output * * sin :i :a sin + * :omega :i :dth end to makecolorlist :cnum local "templist make "templist [] if (logand 1 :cnum) = 1 [make "templist lput :lcolor :templist] [ make "templist lput 0 :templist] if (logand 2 :cnum) = 2 [make "templist lput :lcolor :templist] [ make "templist lput 0 :templist] if (logand 4 :cnum) = 4 [make "templist lput :lcolor :templist] [ make "templist lput 0 :templist] output :templist end to sample23_draw setpc makecolorlist :ran.color line :po.x1 :po.y1 :po.x2 :po.y2 make "lcolor (+ :lcolor :addc) if (or :lcolor > (- 255 :addc) :lcolor < (+ 0 msgn :addc)) \ make "addc msgn :addc end ; Exit Loop command. alias stop byroad to sample23 [:a 200] [:nr 0] 0 (local "lcolor "addc "ran.color) make "lcolor 3 make "addc :lcolor if :nr = 0 then make "ran.color random 7 \ else make "ran.color :nr (local "po.x1 "po.y1 "po.x "po.y2 "omega.1 "omega.2 "omega.3 "omega.4 "delta.1 "delta.2 "delta.3 "delta.4 "i.step ) name 0.35 "i.step ; Phase make "omega.1 (* / random 10 10 4) make "omega.2 (* / random 10 10 4) make "omega.3 (* / random 10 10 4) make "omega.4 (* / random 10 10 4) ; Angular velocity make "delta.1 (* random 4 90) make "delta.2 (* random 4 90) make "delta.3 (* random 4 90) make "delta.4 (* random 4 90) (for "i 0 (* 360 1.5) [ make "po.x1 sample23_function :omega.1 :delta.1 :a :i make "po.y1 sample23_function :omega.2 :delta.2 :a :i make "po.x2 sample23_function :omega.3 :delta.3 :a :i make "po.y2 sample23_function :omega.4 :delta.4 :a :i sample23_draw if button? make "exit "true byroad ; Exit this for loop. ] :i.step) end to forever :@everlist label "loop run :@everlist go "loop end to test23 [:amplitude 200] [:notRandom 0] 0 ; Stop is Mouse button click. ; alias stop byroad (local "exit "wTimes) make "exit "false name 2000 "wTimes hideturtle forever [ clearscreen setbg "black (sample23 :amplitude :notRandom) ; Exit this forever loop. Go to Exit. if :exit [byroad] \ [ wait :wTimes] ] ; label "Exit print "|Exit!| showturtle end
リサージュを2つ合成したちょっと面白い動きをした図形です。
ランダムに、位相と角速度を決めて更に、振幅変調を掛けています。1点から広がりまた元の点に戻る事を繰り返します。
Sample23を実行すると、一回のループで終わりますが、Test23を実行すると無限ループを指定していますので終わりません。:-)
そこで、マウスボタンをクリックすると強制的に終了する様にシカケを、施してみました。
Logo言語では、ループ手続き内からのGO命令で、ループ外への強制脱出は基本的に出来ません。C言語などのBreak命令の様にループ脱出命令を、サポートしていません。
しかし、STOP命令を使えば手続きの終了になるので、ループから安全に脱出できます。
ここでは、alias stop byroad
として別名を付け手続き終了と勘違いしない様に配慮してみました。;-D
#byroadとは、裏通り、抜け道の意味です。
線の色はランダムに7色から1色を選んでいます。そしてその色の255階調グラデーションです。
色の決め方は、指三本分のビット演算。階調は、ある数値を超えたら足したり引いたりしているだけですね。
おまけ BGM付きリサージュ曲線ムービー