如何在Processing中按同一按键循环切换显示不同数据集?
解决方案:Processing右键切换显示不同年份数据集
我来帮你搞定这个切换数据集的需求!你的思路完全正确——用Year变量跟踪当前显示的年份就能实现每次按键切换一个数据集的效果。咱们来一步步修改代码,解决当前一次性显示所有数据的问题:
关键修改思路
- 预加载所有年份的数据,避免每次按键重复读取文件(提升性能)
- 用
Year变量循环切换年份(0对应2015,1对应2016,2对应2017) - 每次切换前重新绘制背景,清除之前的点
- 封装重复的读取和绘制逻辑,让代码更简洁
修改后的完整代码
import java.util.Scanner; import java.io.*; PImage cityMap; // 预存储三个年份的坐标数据 int[][] data2015; int[][] data2016; int[][] data2017; int Year = 0; // 0=2015, 1=2016, 2=2017 void setup() { size(500, 500); cityMap = loadImage("cityMap.png"); // 在程序启动时预加载所有数据,避免重复IO操作 data2015 = loadData("2015data.txt"); data2016 = loadData("2016data.txt"); data2017 = loadData("2017data.txt"); background(cityMap); // 初始显示空白地图 } void draw() { // 保持空白即可,所有绘制逻辑在按键事件中处理 } void keyPressed() { if (key == CODED) { if (keyCode == RIGHT) { // 循环切换年份:0→1→2→0 Year = (Year + 1) % 3; // 先清除画布,重新绘制地图背景 background(cityMap); // 根据当前年份绘制对应数据集 switch(Year) { case 0: drawData(data2015, color(200, 200, 250)); break; case 1: drawData(data2016, color(250, 200, 250)); break; case 2: drawData(data2017, color(20, 200, 250)); break; } } } } // 封装数据读取逻辑,复用代码 int[][] loadData(String filename) { String[] lines = loadStrings(filename); int[][] data = new int[lines.length - 1][2]; // 跳过第一行表头 for (int i = 1; i < lines.length; i++) { Scanner sc = new Scanner(lines[i]); data[i-1][0] = sc.nextInt(); data[i-1][1] = sc.nextInt(); } return data; } // 封装绘制点的逻辑,复用代码 void drawData(int[][] data, color strokeColor) { stroke(strokeColor); for (int[] point : data) { int pixelX = locX2PixX(point[0]); int pixelY = locY2PixY(point[1]); point(pixelX, pixelY); } } // 修正坐标转换函数名(原代码中函数名与调用不一致) int locX2PixX(int locationX) { return (int)((6 * locationX) - 8); } int locY2PixY(int locationY) { return (int)(8 * locationY + 8); }
代码说明
- 预加载数据:在
setup()中一次性读取所有年份的文本文件,存储为二维数组,避免每次按键都重复读取文件,提升程序响应速度。 - 年份循环切换:通过
Year = (Year + 1) % 3实现年份的循环切换,确保每次按右键都会切换到下一个数据集,循环往复。 - 画布清除:每次切换年份前调用
background(cityMap),将画布重置为初始地图状态,避免不同年份的点叠加显示。 - 代码复用:用
loadData()和drawData()函数封装重复的读取和绘制逻辑,让代码结构更清晰,后续新增年份也更容易扩展。 - 函数名修正:原代码中坐标转换函数的定义名与调用名不一致(比如定义
locX2却调用locX2PixX),这里统一修正为正确的函数名,避免运行报错。
内容的提问来源于stack exchange,提问作者Lynne D.
相关产品推荐
相关产品推荐

