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

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);
    }
  }
}

关键改动说明

  1. 分离数据加载与绘制逻辑:将API请求移到独立的loadWeatherData()函数,用dataLoaded标记控制绘制时机,避免网络请求阻塞渲染。
  2. 移绘制到draw()函数:利用Processing的自动刷新机制,确保图形能正确渲染到屏幕。
  3. 修复Calendar逻辑:内层循环结束后重置年份,保证每次外层循环的日期计算正确。
  4. 添加加载提示:优化等待体验,避免空屏困惑。

额外建议

  • 优先使用异步网络请求,进一步避免阻塞主线程;
  • 对气温数据做归一化处理,防止极端气温导致椭圆超出屏幕范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:41:29