p5.js如何实现点击椭圆后将对应颜色与文本色值记录到文件
问题原因
你原来的代码报错核心原因是p5.js属于即时渲染模式:ellipse() 这类绘制函数仅会在画布上绘制对应图形,不会返回可修改的图形实例,不存在wBol.fill()这种调用方式,所有图形的颜色、位置属性都需要你自己定义变量存储,每次draw()循环读取变量重新绘制。
实现思路
- 定义全局变量存储左右两个圆形的背景色、用户选择记录数组
- 每次
draw()循环读取存储的颜色值绘制对应圆形和文本 - 用户点击后判断点击区域,把选中的背景色、对应文本色存入记录数组,再刷新两个圆形的随机背景色
- 用p5.js内置的
saveStrings()方法实现本地文件导出,不需要额外依赖
完整可运行代码
// 存储左右圆的背景色 let leftBg, rightBg; // 存储用户选择记录,每条格式是[r,g,b, textColor(0黑/1白)] let records = []; const CIRCLE_R = 175; // 圆形半径统一配置,避免硬编码 function setup(){ createCanvas(1200, 600); // 初始化两个圆的随机背景色 refreshColors(); } function draw(){ background(51); // 绘制左侧圆 + 黑色文本 fill(leftBg); ellipse(300, 300, CIRCLE_R*2, CIRCLE_R*2); fill(0); textSize(64); text('text', 250, 320); // 绘制右侧圆 + 白色文本 fill(rightBg); ellipse(900, 300, CIRCLE_R*2, CIRCLE_R*2); fill(255); text('text', 850, 320); } function mousePressed(){ const d1 = dist(300, 300, mouseX, mouseY); const d2 = dist(900, 300, mouseX, mouseY); let selectedBg, selectedTextColor; if(d1 <= CIRCLE_R){ // 选中左侧:文本色为黑色,标记为0 selectedBg = leftBg; selectedTextColor = 0; }else if(d2 <= CIRCLE_R){ // 选中右侧:文本色为白色,标记为1 selectedBg = rightBg; selectedTextColor = 1; }else{ // 未点击到有效区域直接返回 return; } // 记录选中数据,RGB值取整方便后续处理 records.push([ Math.round(selectedBg[0]), Math.round(selectedBg[1]), Math.round(selectedBg[2]), selectedTextColor ]); console.log('当前已记录数据:', records); // 刷新下一轮测试的背景色 refreshColors(); // 若需要每次选择后自动保存,取消下面一行的注释即可 // saveRecords(); } // 生成左右圆的新随机背景色 function refreshColors(){ leftBg = [random(0,255), random(0,255), random(0,255)]; rightBg = [random(0,255), random(0,255), random(0,255)]; } // 导出所有记录为CSV文件到本地 function saveRecords(){ let csvContent = "r,g,b,textColor\n"; records.forEach(row => { csvContent += row.join(",") + "\n"; }); saveStrings([csvContent], 'color_preference.csv'); } // 按键盘S键手动触发保存 function keyPressed(){ if(key.toLowerCase() === 's'){ saveRecords(); } }
功能说明
- 点击你认为展示效果更好的圆形,系统会自动记录对应背景色和文本色
- 测试完成后按键盘
S键,即可将所有记录导出为CSV格式文件保存到本地 - 导出的CSV文件可直接用Excel、表格工具打开处理
内容的提问来源于stack exchange,提问作者ArthurVL
相关产品推荐
相关产品推荐

