从seq-> stream获得模数

时间:2014-05-01 21:43:17

标签: clojure quil

下面的代码在整个屏幕中向我绘制了正弦波。 但是,我希望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函数列出。

1 个答案:

答案 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)))

您遇到的一些问题:

  1. sin的输入是以弧度表示的浮点值。我在这里除以100的hackery只是确保我们获得了很好的连续输出。实际上,如果你想循环每n个像素,你需要使用2个PI / n来调整x。
  2. 舍入值会给你积分,因为罪的范围是1到-1。我在这里通过添加100来进行调整。
  3. 你摆弄x的地方取决于具体要求。在这里,我只是通过在绘制函数中获取它的模数来包装你的x值。
  4. 希望这有帮助。