1

我想使用 loadStrings 将数据加载到 csv 文件中,然后绘制相应的 2D 形状。第 1 组是椭圆,第 2 组是三角形,第 3 组是矩形,第 4 组是平行四边形,第 0 组是其他矩形。但是,我的代码无法显示相应的形状。它们不显示任何形状,并且我的代码中没有错误。还有一个问题,有没有办法在每个对应的图表下显示他们的名字?

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
4

1 回答 1

1

你这么近!

Group 是 int ( int group = row.getInt("Group");),而不是 a 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);
    }
  }
}

您可以改进以下几点:

  1. 格式化代码:它将更容易阅读。早点学习是个好习惯:因为你要写的代码会越来越长,保持井井有条会让它更容易阅读。程序越复杂,您花在阅读/调试代码而不是输入指令上的时间就越多。
  2. 只加载一次数据setup()。无需在draw(). (如果您需要 draw(),可以选择清除背景,但是在当前示例中,一切都可以在设置中工作)
  3. 或者,if/else您可以使用switch, 或者与形状的常量一起使用,而不是使用。尽管它可能看起来像更多代码(而不是简单地使用整数值),但它更易于阅读(您无需考虑哪个数字是哪个)并且更易于更新。

这是使用上述注释的示例:

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

最后,注意 which 的用法text(string, x, y)使得在给定位置 (x,y) 显示名称(字符串)变得微不足道。请记住 y 是基线(文本的底部),因此您可能需要更改 x,y 以更好地定位文本。由于数据没有变化,您可以通过简单地渲染一次来节省 CPU 周期,setup()而不是在draw().

于 2021-04-26T14:44:06.887 回答