Lisajous1

to Lisajous1 :omega.x :omega.y [:amp 100] 2
    (local "po.x "po.y)
         
    (for "i 0 360 [
       make "po.x (* :amp sin * :omega.x :i)
       make "po.y (* :amp sin * :omega.y :i)
       dot sentence :po.x :po.y
    ] 0.1)
end
         
1
2

1)Lisajous1 3 4
2)Lisajous1 4 3

 直交する2つの単振動の合成で出来るリサージュ曲線です。
縦方向と横方向で、振幅 amp は同じでも振動数 omega.x omega.y の異なった振り子運動をしている点の軌跡を描いています。
振幅や振動数を、色々変更してバリエーションを楽しんで下さい。

Sample23

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付きリサージュ曲線ムービー