p5.js 的光标轨迹算法

Cursor trail algorithm for p5.js

我在 Processing 的网站 (https://processing.org/examples/storinginput.html) 上找到了这个小编码练习,并决定制作一个 p5.js 版本。

关于这个算法,我不明白的部分是当用作椭圆比例的变量 i 增加时,(在轨迹中)绘制的椭圆如何缩小。我怀疑它与变量索引的值有关,但我无法将其拼凑起来。

有谁知道这个算法是如何工作的?任何帮助将不胜感激。

这是代码的 Javascript 版本:

var num = 60;
var mx = []; 
var my = []; 

function setup() {

  createCanvas(windowHeight, windowHeight);
  noStroke();
  fill('rgba(0,0,0, 0.5)');
  noCursor();

}

function draw() {

  background(255);

  var array_pos = (frameCount) % num; 
  mx[array_pos] = mouseX; 
  my[array_pos] = mouseY; 


  for (var i = 0; i < num; i++) {
    var index = (array_pos + 1 + i) % num; 
    ellipse(mx[index], my[index], i, i); 
  }

}

当前鼠标位置存储在每一帧的数组中。当数组满了,会从头重新填满。这是使用模 (%) 运算符实现的(% 计算除法的余数)。

var array_pos = frameCount % num; 
mx[array_pos] = mouseX; 
my[array_pos] = mouseY; 

圆的直径取决于循环的控制变量(i)。最小的圆是索引为 array_pos + 1 的圆。因此,使用 i == 0 绘制索引为 array_pos + 1 的圆。随着 i 的增加,以下圆圈变大。同样,模运算符 (%) 用于防止数组被越界访问。

var index = (array_pos + 1 + i) % num; 

var num = 60;
var mx = []; 
var my = []; 

function setup() {
    createCanvas(windowWidth, windowHeight);
    noCursor();
}

function draw() {
    var array_pos = frameCount % num; 
    mx[array_pos] = mouseX; 
    my[array_pos] = mouseY; 

    background(255);
    noStroke();
    fill(255, 0, 0, 127);
    for (var i = 0; i < num; i++) {
        var index = (array_pos + 1 + i) % num; 
        ellipse(mx[index], my[index], i, i); 
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.3.1/p5.min.js"></script>