下面的代码在整个屏幕中向我绘制了正弦波。 但是,我希望x永远不会超过(宽度)。此时,应该清除窗口,并且应该再次绘制波形,从0开始。我试过
(set-state! :x (mod (seq->stream x) (width)))
但它没有用。我检查了some examples,尝试了一些代码,这些代码使用了检查是否(> 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))))
即使我通过在(into '())
中包装if语句来尝试此代码,代码仍然抱怨:" IllegalArgumentException不知道如何创建ISeq:java.lang.Long clojure。 lang.RT.seqFrom&#34 ;.它与:
(loop [x 0]
(if (> x 10)
0
(recur (inc x))))
这个if语句有什么问题? clojure api说,如果测试测试条件,然后评估并产生然后或者分支,相应地。如果它产生,它应该吐出那个整数,而这反过来又会被添加到列表中,而我认为这个整数应该由take函数列出。
答案 0 :(得分:0)
更像这样的东西似乎能够带来你想要的效果。
(defn draw []
(stroke 0)
(stroke-weight 2)
(let [x ((state :x))
y (+ 100 (* 100 (sin (/ x 100))))]
(ellipse (mod x (width)) y 4 4)))
您遇到的一些问题:
希望这有帮助。