You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Processing角度变量使用问题求助:树根效果草图报错排查

修正后的Processing树根效果代码及问题解析

代码中的核心错误点

  • 数组类型不匹配:pins被定义为float[],但createVector()返回的是PVector对象,需改为PVector[]类型。
  • 数组未初始化长度:原代码中pins初始化为空数组,循环赋值时会抛出数组越界错误,需提前分配对应长度。
  • 未声明变量:angle和color未提前声明,且color是Processing关键字,不能用作变量名,需改为strokeColor。
  • 错误的遍历方式:尝试用lambda表达式遍历数组的写法不符合Processing语法,需改用标准for循环遍历每个PVector元素。
  • 局部变量覆盖全局变量:setup函数中float y=0;会覆盖全局的y变量,导致draw函数中的y无法正确递增。
  • 语法遗漏:y++后缺少分号,line函数参数错误添加int修饰符。

修正后的完整代码

PVector[] pins;
int pins_num = 150;
float y, x;

void setup (){
  size(1920, 1080);
  y = 0; // 去掉局部变量的float声明,使用全局变量
  pins = new PVector[pins_num]; // 初始化数组长度
  for (int i=0; i < pins_num; i++ ) {
    pins[i] = createVector(random(width), random(height));
  }
  background(255); // 添加背景色,避免帧叠加
}

void draw (){
  if (y < height) {
    for (int x=0; x < width; x++) {
      float angle = 0; // 声明角度变量
      // 遍历所有pin,累加角度
      for (PVector p : pins) {
        angle += atan2(p.y - y, p.x - x);
      }
      // 映射sin(angle)到0-255的颜色范围,使用strokeColor作为变量名
      float strokeColor = map(sin(angle), -1, 1, 0, 256);
      stroke(strokeColor);
      // 绘制垂直线,参数无需额外类型声明
      line(x, y, x, y + strokeColor);
    }
    y++; // 添加分号
  } else {
    noLoop(); // 绘制完成后停止循环
  }
}

关键逻辑说明

  1. 角度计算:通过atan2(p.y - y, p.x - x)计算每个随机pin点到当前绘制行(x,y)的角度,累加所有角度得到总角度值。
  2. 颜色映射:利用sin(angle)的周期性变化,将其值映射到0-255的灰度范围,实现随角度变化的明暗效果,增强立体感。
  3. 绘制逻辑:逐行绘制垂直线,线条长度由映射后的颜色值决定,随着y递增逐步铺满整个画布,形成类似树根纹理的视觉效果。

内容的提问来源于stack exchange,提问作者Grace Whitman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:45:32