微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何加载 .csv 文件并在处理中绘制 2d 形状

如何解决如何加载 .csv 文件并在处理中绘制 2d 形状

我想用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,x+20,y-20,y);
    } else if ("3".equals(group)){
      rect(x,50,50);
    }  else if ("4".equals(group)){
      quad(x,x+100,x+150,y+95,x+40,y+95);
    } else if ("0".equals(group)){
      rect(x,60);
    }
  }
}

这是一个名为“text.csv”的csv文件内容是:

Name,X,Y,Group
Victor Anderson,627,705,2
Jack Scott,808,643,3
Sean Robinson,624,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,80);
    } else if (group == 2) {
      triangle(x,x+20,y-20,y);
    } else if (group == 3) {
      rect(x,50,50);
    } else if (group == 4) {
      quad(x,x+100,x+150,y+95,x+40,y+95);
    } else if (group == 0) {
      rect(x,60);
    }
  }
}

您可以改进以下几点:

  1. 格式化代码:它会更容易阅读。尽早开始是一个好习惯:随着您将编写的代码越来越长,保持井井有条将使阅读更容易。程序越复杂,您花在阅读/调试代码上的时间就越多,而不是输入指令。
  2. setup() 中仅加载一次数据。无需在 draw() 中每秒多次重新加载相同的数据。 (如果需要 draw(),可选择清除背景,但在当前示例中,一切都可以在设置中工作)
  3. 或者,您可以使用 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,60);
        break;
      case(SHAPE_ELLIPSE):
        ellipse(x,80);
        break;
      case(SHAPE_TRIANGLE):
        triangle(x,y);
        break;
      case(SHAPE_RECT):
        rect(x,50);
        break;
      case(SHAPE_PARALLELOGRAM):
        quad(x,y+95);
        break;
    }
    
    // render text
    text(name,x,y);
  }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。