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(); // 绘制完成后停止循环 } }
关键逻辑说明
- 角度计算:通过
atan2(p.y - y, p.x - x)计算每个随机pin点到当前绘制行(x,y)的角度,累加所有角度得到总角度值。 - 颜色映射:利用
sin(angle)的周期性变化,将其值映射到0-255的灰度范围,实现随角度变化的明暗效果,增强立体感。 - 绘制逻辑:逐行绘制垂直线,线条长度由映射后的颜色值决定,随着y递增逐步铺满整个画布,形成类似树根纹理的视觉效果。
内容的提问来源于stack exchange,提问作者Grace Whitman
相关产品推荐
相关产品推荐

