Clojure/Quilでリセージュと内サイクロイド
数式で表せる曲線を描いてみる。
元ネタ
Proce55ing.walker,blog » Blog Archive » 図形を描く数式の使い方
毎度のことながらProcessing Advent Calendar。こういう記事がまとまっている場所があるのは、習作アイディアをもらうのにすごく便利で、参加された方々には感謝の念しかない。
リサジュー曲線
数式
コード
(defn lissajous [A B a b d] (fn [t] (let [x (-> t (* a) q/cos (* A)) y (-> t (* b) (+ d) q/sin (* B))] [x y])))
内サイクロイド
数式
コード
(defn inner-cycloid [A B rc rm] (fn [t] (let [rht (-> t (* (- rc rm)) (/ rm)) x (* A (+ (-> t q/cos (* (- rc rm))) (-> rht q/cos (* rm)))) y (* B (- (-> t q/sin (* (- rc rm))) (-> rht q/sin (* rm))))] [x y])))
感想
Lispの悪評の一因である括弧病は、すぐに慣れて気にならなくなるものだが、数式をコードにするときだけは別で、普通にLispっぽく(function arg1 arg2 ...)
などと書いていると、Algol系言語やFortranにくらべて非常にごちゃごちゃしてくる。
その点、threading
マクロをうまく使えばある程度きれいに書ける(気がする)。
しかし順序がある程度決まってしまう上に、数式とはかなりレイアウトが違う記法になるので直感的かというと微妙かもしれない。
あとAとBは垂直・水平面でのscale値だが、基本同一にしているので単に同一のscaleという引数にしてしまったほうがわかりやすかったかも。