下面的代码为我绘制了整个屏幕的正弦波。然而,我希望x永远不会超过(宽度)。在这一点上,窗口应该被清除,波应该再次绘制,从0开始。我试着
(set-state! :x (mod (seq->stream x) (width)))
,但它没有工作。我检查了一些例子,尝试了一些代码,利用检查是否(> x (width))
,试图将逻辑放入绘制函数,但它们也不工作。
我想在有限的显示器上画一个连续的波形(如心电图)。我很感激你的帮助。
(ns soso.core
(:require [quil.core :refer :all]
[quil.helpers.seqs :refer [seq->stream range-incl]]))
(defn setup []
(smooth)
(frame-rate 100)
(background 255)
(let [x (range-incl)]
(set-state! :x (seq->stream x))))
(defn draw []
(stroke 0)
(stroke-weight 2)
(let [x ((state :x))
y (round (* 100 (abs (sin x))))]
(ellipse x y 4 4)))
<标题>编辑当我试图将逻辑放入draw函数时,我在setup函数中写入(set-state! :x 0)
,并将以下代码放入draw函数中:
(let [x (if (> ((state :x)) 10)
0
(inc ((state :x))))])
但是它没有工作,并且没有在任何nrepl缓冲区中抛出任何错误。为了看看发生了什么,我在用户repl:
中尝试了以下代码(let [x 0]
(take 20
(if (> x 10)
0
(inc x))))
即使我尝试通过将if语句包装在(into '())
中,代码也会抱怨:"IllegalArgumentException不知道如何创建ISeq from: java.lang.Long clojure.lang.RT.seqFrom"。与
(loop [x 0]
(if (> x 10)
0
(recur (inc x))))
这个if语句有什么问题?clojure api表示,if测试测试条件,然后计算并相应地产生then或else分支。如果它屈服了,它应该输出那个整数,然后把它加到列表中,我想这个列表应该由take函数列出
标题>像这样的东西似乎给你正在寻找的效果。
(defn draw []
(stroke 0)
(stroke-weight 2)
(let [x ((state :x))
y (+ 100 (* 100 (sin (/ x 100))))]
(ellipse (mod x (width)) y 4 4)))
你遇到的几个问题:
- sin的输入是一个以弧度为单位的浮动值。这里除以100的技巧只是为了确保我们得到一个连续的输出。实际上如果你想循环每n个像素,你需要使用2 PI/n来调整x。
- 将值四舍五入会给你点,因为sin的域是1到-1。这里我通过添加100来调整。
- 在哪里摆弄x将取决于确切的需求。在这里,我只是通过在绘制函数中取它的模数来包装你的x值。