Processing代码中椭圆无法显示的原因排查求助
解决Processing中循环内绘制椭圆不显示的问题
问题根源
你的代码在setup()中同步执行大量网络请求,这会阻塞Processing的渲染线程——尽管坐标计算有效,但长时间的API请求会让setup执行周期过长,循环内的绘制操作无法及时刷新到屏幕上。此外,你的Calendar操作存在逻辑错误:内层循环每次减一年后未重置年份,会导致后续API请求的日期混乱(虽不直接影响绘制,但会导致数据错误)。
修正后的代码
import http.requests.*; import java.util.Calendar; float[][] temps; int cols = 8; int rows = 11; boolean dataLoaded = false; void setup() { fullScreen(); background(0); noStroke(); temps = new float[cols][rows]; loadWeatherData(); } void loadWeatherData() { Calendar calendar = Calendar.getInstance(); for(int i=0; i<cols; i++) { // 外层循环:每次往前推一天,记录当前月日 calendar.add(Calendar.DAY_OF_YEAR, -1); int m = calendar.get(Calendar.MONTH) + 1; int d = calendar.get(Calendar.DAY_OF_MONTH); // 保存当前年份,内层循环结束后重置 int originalYear = calendar.get(Calendar.YEAR); for (int p=0; p<rows; p++) { calendar.add(Calendar.YEAR, -1); int y = calendar.get(Calendar.YEAR); String todate = y+"-"+m+"-"+d; GetRequest get = new GetRequest("https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/Innsbruck/"+todate+"?unitGroup=metric&include=days&key=xxx&contentType=json"); get.send(); JSONObject response = parseJSONObject(get.getContent()); float tempmax = response.getJSONArray("days").getJSONObject(0).getFloat("tempmax"); temps[i][p] = tempmax; } // 重置年份,避免影响下一次外层循环的日期计算 calendar.set(Calendar.YEAR, originalYear); } dataLoaded = true; } void draw() { if (!dataLoaded) { // 加载状态提示 background(0); fill(255); textAlign(CENTER, CENTER); text("加载数据中...", width/2, height/2); return; } background(0); fill(255); // 数据加载完成后统一绘制 for(int i=0; i<cols; i++) { for (int p=0; p<rows; p++) { float tempmax = temps[i][p]; float pointx = width - width/10 - width/10*i; float pointy = height/2 + tempmax*10; ellipse(pointx, pointy, 5, 5); } } }
关键改动说明
- 分离数据加载与绘制逻辑:将API请求移到独立的
loadWeatherData()函数,用dataLoaded标记控制绘制时机,避免网络请求阻塞渲染。 - 移绘制到draw()函数:利用Processing的自动刷新机制,确保图形能正确渲染到屏幕。
- 修复Calendar逻辑:内层循环结束后重置年份,保证每次外层循环的日期计算正确。
- 添加加载提示:优化等待体验,避免空屏困惑。
额外建议
- 优先使用异步网络请求,进一步避免阻塞主线程;
- 对气温数据做归一化处理,防止极端气温导致椭圆超出屏幕范围。
内容的提问来源于stack exchange,提问作者Dggamp
相关产品推荐
相关产品推荐

