需要帮助翻译foo + =(bar - foo)* qux;到Clojure

时间:2013-06-04 19:44:56

标签: java clojure processing

我在Java / Processing

中有以下代码
  posX += (targetX - posX) * easing;
  posY += (targetY - posY) * easing;

但是我正在努力将其转化为Clojure,任何帮助都将不胜感激!

4 个答案:

答案 0 :(得分:5)

基于你的代码片段,我猜你基本上是使用另一个集合和一个缓动因子来变换一组坐标。

我将定义一个函数来以下列方式封装转换:

(defn ease-coord [factor src tgt]
  (+ src (* (- tgt src) factor)))

(defn ease [factor src tgt]
  (map (partial ease-coord factor) src tgt))

(ease 0.1 [1 2] [3 10])
;=> (1.2 2.8)
(ease 0.1 [1 2 3] [3 10 5])
;=> (1.2 2.8 3.2)

请注意,ease函数实际上适用于具有任意坐标数的向量和列表。

答案 1 :(得分:1)

如果您要使用矢量数学做很多工作,我建议使用core.matrix。它为所有常见的数学函数(+, - ,* etc ..)提供向量覆盖,并允许您透明地使用表示为常规Clojure向量的数学向量。

以下是它的样子:

(use 'clojure.core.matrix.operators)

(defn lerp [start end factor]
     (+ start (* (- end start) factor)))

(lerp [1 2] [10 10] 0.1)
=> [1.9 2.8]

如果您关心效果,还可以使用vectorz-clj实施,该实施会针对(x,y)坐标使用专门的快速core.matrix类型增强Vector2

答案 2 :(得分:0)

免责声明:我正在学习clojure,这种解决方案很可能不是惯用语。

;    Let *tx*, *ty* be your target coordinate
;    Let sx, sy be your starting coordinate
;    Let *eg* be your easing
    (def ^:dynamic *eg* 0.05)
    (def ^:dynamic *tx* 100)
    (def ^:dynamic *ty* 100)
    (defn next-position [[sx sy]] [(+ sx (* (- *tx* sx) *eg*)) (+ sy (* (- *ty* sy) *eg*))])
    (defn positions [[x y]] (iterate next-position [x y]))

; To get the next position
(next-position [5 6])

; To get the next 100 positions
(take 100 (positions [5 6]))

答案 3 :(得分:0)

什么是posX,posY?

它们可以是原子。

(def posX (atom 0))
(def posY (atom 0))

如果你想改变posX,你可以写一个函数

(defn update-posx 
  [targetX easing] 
  (swap! 
    posX 
    #(+ % (* (- targetX %) easing))))

更新类似于

(update-posx 20 30)