Arantium Maestum

プログラミング、囲碁、読書の話題

Clojure/Quilでリセージュと内サイクロイド

数式で表せる曲線を描いてみる。

元ネタ

Proce55ing.walker,blog » Blog Archive » 図形を描く数式の使い方

毎度のことながらProcessing Advent Calendar。こういう記事がまとまっている場所があるのは、習作アイディアをもらうのにすごく便利で、参加された方々には感謝の念しかない。

リサジュー曲線

Quil -L7xNULDgJ-jiHImkFoW

数式

{x = Acos{(a\theta)}}

{y = Bsin{(b\theta + \delta)}}

コード

(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])))

サイクロイド

Quil -L7xQHFKw8TVbxYCOdch

数式

{x = (r_c - r_m)cos{\theta} + r_m cos{(\frac{r_c-r_m}{r_m}\theta)}}

{y = (r_c - r_m)sin{\theta} - r_m sin{(\frac{r_c-r_m}{r_m}\theta)}}

コード

(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という引数にしてしまったほうがわかりやすかったかも。