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

Processing中基于字符串分割与循环生成自定义数量及高度建筑立面的技术求助

解决建筑立面生成的数组提取与动态更新问题

我看了你代码里的问题啦,核心是字符串转整数数组的写法错误,以及没有利用用户输入的buffer来动态更新建筑高度数据,另外还有一些可以优化的逻辑,我帮你一步步修正:

首先,先看修正后的完整代码

String buffer = "";
int[] buildingHeights; // 用更清晰的变量名替代原有的b

void setup () {
  size(1200, 800);
  background(0);
  // 初始化默认的建筑高度数组
  String defaultBh = "9,4,6,8,12,2";
  buildingHeights = parseStringToIntArray(defaultBh);
}

void draw () {
  // draw循环留空没问题,但如果需要实时渲染可以在这里调用Textbox()
}

void Textbox() {
  fill(255);
  textSize(30);
  text(buffer, 5, height-10);
}

void keyTyped() {
  if (key == BACKSPACE) {
    if (buffer.length() > 0) {
      buffer = buffer.substring(0, buffer.length() - 1);
    }
    background(0);
    Textbox(); // 退格后重新绘制输入框
  } else if (key == ENTER) {
    background(0);
    // 把用户输入的字符串转成整数数组
    buildingHeights = parseStringToIntArray(buffer);
    GenerateFacade();
    println("当前建筑高度数据:", buffer);
    buffer = ""; // 清空输入框,方便下次输入
  } else {
    buffer = buffer + key;
    background(0);
    Textbox();
  }
}

// 封装字符串转整数数组的工具方法
int[] parseStringToIntArray(String input) {
  if (input.isEmpty()) {
    // 如果输入为空,返回默认数组
    return parseStringToIntArray("9,4,6,8,12,2");
  }
  String[] stringArray = split(input, ",");
  int[] intArray = new int[stringArray.length];
  for (int i = 0; i < stringArray.length; i++) {
    // 处理可能的空字符串或非数字输入,这里简单转为0
    try {
      intArray[i] = int(stringArray[i].trim());
    } catch (NumberFormatException e) {
      intArray[i] = 0;
    }
  }
  return intArray;
}

void GenerateFacade() {
  if (buildingHeights.length == 0) return;
  
  fill(128);
  stroke(0);
  
  // 先找出最大高度,只需要遍历一次
  int maxHeight = 0;
  for (int h : buildingHeights) {
    if (h > maxHeight) {
      maxHeight = h;
    }
  }
  
  float buildingWidth = width / (float)buildingHeights.length;
  // 遍历数组生成每个建筑矩形
  for (int i = 0; i < buildingHeights.length; i++) {
    float rectX = i * buildingWidth;
    // 计算当前建筑的像素高度(按比例缩放)
    float rectHeight = (float)buildingHeights[i] / maxHeight * height;
    float rectY = height - rectHeight;
    
    rect(rectX, rectY, buildingWidth, rectHeight);
  }
}

关键改进点说明:

  • 修复字符串转整数数组的错误:原代码中int[] b = int(split(bh, ","));写法不对,Processing的split返回String[],需要手动遍历转成int[],我封装了parseStringToIntArray方法,还处理了输入为空或非法字符的情况。
  • 动态更新建筑数据:现在按下ENTER后,会把用户输入的buffer内容转成新的buildingHeights数组,实现自定义数量和高度的需求。
  • 优化最大高度计算:原代码在GenerateFacade里用嵌套循环每次都遍历数组找最大高度,现在只需要遍历一次,提升效率。
  • 变量名更清晰:把b改成buildingHeights,让代码可读性更强。
  • 输入交互优化:退格后会重新绘制输入框,按下回车后清空输入框,提升用户体验。

你现在可以运行这段代码,输入类似5,7,3,10这样的数字串,按下回车就能生成对应数量和高度的建筑立面啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:57:28