从序列>流获取模量

  • 本文关键字:获取 clojure quil
  • 更新时间 :
  • 英文 :


下面的代码为我绘制了整个屏幕的正弦波。然而,我希望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)))

你遇到的几个问题:

  1. sin的输入是一个以弧度为单位的浮动值。这里除以100的技巧只是为了确保我们得到一个连续的输出。实际上如果你想循环每n个像素,你需要使用2 PI/n来调整x。
  2. 将值四舍五入会给你点,因为sin的域是1到-1。这里我通过添加100来调整。
  3. 在哪里摆弄x将取决于确切的需求。在这里,我只是通过在绘制函数中取它的模数来包装你的x值。

相关内容

  • 没有找到相关文章

最新更新