我尝试在Kevinsa5的帮助下在Processing中转换以下程序以从txt文件中读取变量,但我不知道为什么不起作用。我做错了什么?程序运行时不会显示任何错误,只是打开的 Canvas 没有显示应有的任何颜色。
static final int ribbon_length = 255, H = 200;
void setup() {
size(ribbon_length, H);
}
void draw() {
String[] lines = loadStrings("input.txt");
float p = float(split(lines[0], "=")[1]);
int up_y = int(split(lines[1], "=")[1]);
int wide = int(split(lines[2], "=")[1]);
int high = int(split(lines[3], "=")[1]);
float a = pow (ribbon_length, 1-p);
float colour = 0;
for (int step = 0; step <= 255; step++) {
colour = a * pow (step, p);
fill(colour,0,0);
rect(wide*step, up_y, wide, high);
noStroke();
}
}
最佳答案
删除分号是一个好主意,因为它简化了代码必须执行的操作。然而,沿着 =
分割字符串会得到 "float p "
和 "5"
—— 注意 5 之前的空格!字符串中数字之前的空格使其无法解析:
println("with a space: \t" + int(" 5"));
println("without a space: \t" + int("5"));
给出这个输出:
with a space: 0
without a space: 5
现在,看看你的代码。您绝对不需要每秒读取文本文件 60 次,因此请将其从 draw()
移至 setup()
。由于您想要删除每个值之前的空格,因此您可以像使用分号一样编辑文本文件,或者只是更改拆分方式。不要按 "="
拆分,而是按 "= "
拆分。这代表了上述变化:
static final int ribbon_length = 255, H = 200;
float p;
int up_y, wide, high;
void setup() {
size(ribbon_length, H);
String[] lines = loadStrings("input.txt");
p = float(split(lines[0], " = ")[1]);
println(p);
up_y = int(split(lines[1], " = ")[1]);
println(up_y);
wide = int(split(lines[2], " = ")[1]);
println(wide);
high = int(split(lines[3], " = ")[1]);
println(high);
}
void draw() {
float a = pow (ribbon_length, 1-p);
float colour = 0;
for (int step = 0; step <= 255; step++) {
colour = a * pow (step, p);
fill(colour,0,0);
rect(wide*step, up_y, wide, high);
noStroke();
}
}
这是输入:
float p = 5
int up_y = 10
int wide = 5
int high = 10
当您遇到意外行为时,调试的第一步通常是使用 println()
查看变量的值。在您的代码中,大多数情况下都会打印 0
,这表明文本文件中的数字不知何故没有进入变量(要么您读错了,要么您读错了)解析它们是错误的)。然后,如果您细心的话,打印类似 println(split(lines[0], "=")[1])
的内容会显示出多余的空间。然后您可以在几分钟内得到答案,而不必等待 16 个多小时才有人回答问题:)
关于java - 从处理中的文本中读取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22009421/