如何加载 .csv 文件并在处理中绘制二维形状
how to load .csv file and draw 2d shapes in processing
我想用loadStrings加载数据到一个csv文件中,然后绘制相应的二维图形。第1组为椭圆,第2组为三角形,第3组为矩形,第4组为平行四边形,第0组为其他矩形。
但是,我的代码无法显示相应的shape.They 不显示任何形状,并且我的代码没有错误。还有一个问题,有没有办法在每个对应的图下显示他们的名字?
Table table;
void setup(){
size(1000,1000);
}
void draw(){
table = loadTable("text.csv", "header");
for (TableRow row : table.rows()) {
int x = row.getInt("X");
int y = row.getInt("Y");
int group = row.getInt("Group");
String name= row.getString("Name");
fill(#000000);
if("1".equals(group)){
ellipse(x,y,80,80);
} else if ("2".equals(group)){
triangle(x,y,x+20,y-20,x+20,y);
} else if ("3".equals(group)){
rect(x,y,50,50);
} else if ("4".equals(group)){
quad(x, y ,x+100, y, x+150, y+95, x+40, y+95);
} else if ("0".equals(group)){
rect(x,y,50,60);
}
}
}
这是名为“text.csv”的 csv 文件,内容为:
Name,X,Y,Group
Victor Anderson,627,705,2
Jack Scott,808,643,3
Sean Robinson,624,627,4
William Rodriguez,423,396,1
Aaron Kelly,775,181,0
你太接近了!
Group 是一个 int (int group = row.getInt("Group");
),而不是 String
,因此条件看起来像:
if(group == 1){
ellipse(x,y,80,80);
...
在上下文中:
Table table;
void setup() {
size(1000, 1000);
}
void draw() {
table = loadTable("text.csv", "header");
for (TableRow row : table.rows()) {
int x = row.getInt("X");
int y = row.getInt("Y");
int group = row.getInt("Group");
String name= row.getString("Name");
fill(#000000);
if (group == 1) {
ellipse(x, y, 80, 80);
} else if (group == 2) {
triangle(x, y, x+20, y-20, x+20, y);
} else if (group == 3) {
rect(x, y, 50, 50);
} else if (group == 4) {
quad(x, y, x+100, y, x+150, y+95, x+40, y+95);
} else if (group == 0) {
rect(x, y, 50, 60);
}
}
}
您可以改进以下几点:
- 格式化代码:这样更容易阅读。提早开始是一个好习惯:随着您编写的代码会越来越长,保持代码井井有条会使它更容易阅读。程序越复杂,您花在 reading/debugging 代码上的时间就越多,而不是输入指令。
- 在
setup()
中仅加载一次数据。在 draw()
中不需要每秒多次重新加载相同的数据。 (如果需要 draw(),可选择清除背景,但是在当前示例中,一切都可以在设置中工作)
- 可选地,您可以使用
switch
而不是 if/else
,也许与形状常量一起使用。尽管它可能看起来像更多的代码(而不是简单地使用整数值),但它更容易阅读(你不需要考虑哪个数字是哪个)并且更容易更新。
下面是一个使用上述注释的示例:
Table table;
final int SHAPE_OTHER_RECT = 0;
final int SHAPE_ELLIPSE = 1;
final int SHAPE_TRIANGLE = 2;
final int SHAPE_RECT = 3;
final int SHAPE_PARALLELOGRAM = 4;
void setup() {
size(1000, 1000);
// load the table once
table = loadTable("text.csv", "header");
// reset background to white
background(255);
for (TableRow row : table.rows()) {
int x = row.getInt("X");
int y = row.getInt("Y");
int group = row.getInt("Group");
String name= row.getString("Name");
fill(#000000);
switch(group){
case(SHAPE_OTHER_RECT):
rect(x, y, 50, 60);
break;
case(SHAPE_ELLIPSE):
ellipse(x, y, 80, 80);
break;
case(SHAPE_TRIANGLE):
triangle(x, y, x+20, y-20, x+20, y);
break;
case(SHAPE_RECT):
rect(x, y, 50, 50);
break;
case(SHAPE_PARALLELOGRAM):
quad(x, y, x+100, y, x+150, y+95, x+40, y+95);
break;
}
// render text
text(name, x, y);
}
}
最后,请注意 text(string, x, y)
的用法,这使得在给定位置 (x,y) 显示名称(字符串)变得微不足道。请记住,y 是基线(文本的底部),因此您可能需要更改 x,y 以更好地定位文本。由于数据没有变化,您可以通过简单地在 setup()
中渲染一次而不是在 draw()
.
中连续重新渲染相同的数据来节省 CPU 周期
我想用loadStrings加载数据到一个csv文件中,然后绘制相应的二维图形。第1组为椭圆,第2组为三角形,第3组为矩形,第4组为平行四边形,第0组为其他矩形。 但是,我的代码无法显示相应的shape.They 不显示任何形状,并且我的代码没有错误。还有一个问题,有没有办法在每个对应的图下显示他们的名字?
Table table;
void setup(){
size(1000,1000);
}
void draw(){
table = loadTable("text.csv", "header");
for (TableRow row : table.rows()) {
int x = row.getInt("X");
int y = row.getInt("Y");
int group = row.getInt("Group");
String name= row.getString("Name");
fill(#000000);
if("1".equals(group)){
ellipse(x,y,80,80);
} else if ("2".equals(group)){
triangle(x,y,x+20,y-20,x+20,y);
} else if ("3".equals(group)){
rect(x,y,50,50);
} else if ("4".equals(group)){
quad(x, y ,x+100, y, x+150, y+95, x+40, y+95);
} else if ("0".equals(group)){
rect(x,y,50,60);
}
}
}
这是名为“text.csv”的 csv 文件,内容为:
Name,X,Y,Group
Victor Anderson,627,705,2
Jack Scott,808,643,3
Sean Robinson,624,627,4
William Rodriguez,423,396,1
Aaron Kelly,775,181,0
你太接近了!
Group 是一个 int (int group = row.getInt("Group");
),而不是 String
,因此条件看起来像:
if(group == 1){
ellipse(x,y,80,80);
...
在上下文中:
Table table;
void setup() {
size(1000, 1000);
}
void draw() {
table = loadTable("text.csv", "header");
for (TableRow row : table.rows()) {
int x = row.getInt("X");
int y = row.getInt("Y");
int group = row.getInt("Group");
String name= row.getString("Name");
fill(#000000);
if (group == 1) {
ellipse(x, y, 80, 80);
} else if (group == 2) {
triangle(x, y, x+20, y-20, x+20, y);
} else if (group == 3) {
rect(x, y, 50, 50);
} else if (group == 4) {
quad(x, y, x+100, y, x+150, y+95, x+40, y+95);
} else if (group == 0) {
rect(x, y, 50, 60);
}
}
}
您可以改进以下几点:
- 格式化代码:这样更容易阅读。提早开始是一个好习惯:随着您编写的代码会越来越长,保持代码井井有条会使它更容易阅读。程序越复杂,您花在 reading/debugging 代码上的时间就越多,而不是输入指令。
- 在
setup()
中仅加载一次数据。在draw()
中不需要每秒多次重新加载相同的数据。 (如果需要 draw(),可选择清除背景,但是在当前示例中,一切都可以在设置中工作) - 可选地,您可以使用
switch
而不是if/else
,也许与形状常量一起使用。尽管它可能看起来像更多的代码(而不是简单地使用整数值),但它更容易阅读(你不需要考虑哪个数字是哪个)并且更容易更新。
下面是一个使用上述注释的示例:
Table table;
final int SHAPE_OTHER_RECT = 0;
final int SHAPE_ELLIPSE = 1;
final int SHAPE_TRIANGLE = 2;
final int SHAPE_RECT = 3;
final int SHAPE_PARALLELOGRAM = 4;
void setup() {
size(1000, 1000);
// load the table once
table = loadTable("text.csv", "header");
// reset background to white
background(255);
for (TableRow row : table.rows()) {
int x = row.getInt("X");
int y = row.getInt("Y");
int group = row.getInt("Group");
String name= row.getString("Name");
fill(#000000);
switch(group){
case(SHAPE_OTHER_RECT):
rect(x, y, 50, 60);
break;
case(SHAPE_ELLIPSE):
ellipse(x, y, 80, 80);
break;
case(SHAPE_TRIANGLE):
triangle(x, y, x+20, y-20, x+20, y);
break;
case(SHAPE_RECT):
rect(x, y, 50, 50);
break;
case(SHAPE_PARALLELOGRAM):
quad(x, y, x+100, y, x+150, y+95, x+40, y+95);
break;
}
// render text
text(name, x, y);
}
}
最后,请注意 text(string, x, y)
的用法,这使得在给定位置 (x,y) 显示名称(字符串)变得微不足道。请记住,y 是基线(文本的底部),因此您可能需要更改 x,y 以更好地定位文本。由于数据没有变化,您可以通过简单地在 setup()
中渲染一次而不是在 draw()
.