java - 如何使用 ArrayList.get()?

标签 java processing

我正在Processing中编写一个程序来制作一个3D散点图,可以使用PeasyCam在空间中旋转。数据从文本文件读入 PVector 的 ArrayList。整个代码如下所示。我不明白的是,需要在 draw() 中(重复)调用 importTextfile() ,这会显着减慢速度。为什么我不能在 setup() 中调用一次它?使用draw()中的“println(pointsList)”,我可以看到如果pointList前面没有importTextFile(),它就会发生变化。谁能解释为什么?

(更新:通过尝试构建一个最小的工作示例,我现在发现问题是当我制作一个 PVector V 然后重写它以将其映射到显示窗口时。我仍然会感谢有关在 setup() 期间调用 importTextFile() 的良好解决方案的反馈。我应该使用什么来代替 .get(),以便我获得 Arraylist 中内容的副本,而不是指向 ArrayList 中实际值的指针?)

这是代码:

import peasy.*;
PeasyCam cam;
ArrayList <PVector>pointList;   

int maxX = 0;
int maxY = 0;
int maxZ = 0;

int minX = 10000;
int minY = 10000;
int minZ = 10000;

int range = 0;

void setup() {
   size(500, 500, P3D);
   cam = new PeasyCam(this, width/2, width/2, width/2, 800);
   cam.setMinimumDistance(100);
   cam.setMaximumDistance(2000);
   pointList = new ArrayList();
   importTextFile();
   println(pointList);

 //Determine min and max along each axis
   for (int i=0; i < pointList.size(); i++) {
      PVector R = pointList.get(i);
      if (R.x > maxX) {
        maxX = (int)R.x;
      }
      if (R.x < minX) {
        minX = (int)R.x;
      }
      if (R.y > maxY) {
        maxY = (int)R.y;
      }
      if (R.y < minY) {
        minY = (int)R.y;
      }
      if (R.z > maxZ) {
        maxZ = (int)R.z;
      }
      if (R.z < minZ) {
        minZ = (int)R.z;
      }
   }

   if (maxX - minX > range) {
      range = maxX - minX;
   }
   if (maxY - minY > range) {
      range = maxY - minY;
   }
   if (maxZ - minZ > range) {
      range = maxZ - minZ;
   }
   println(pointList);
}

void draw() {
    //importTextFile();  Uncomment to make run properly
    println(pointList);
    background(255);
    stroke(0);
    strokeWeight(2);
    line(0, 0, 0, width, 0, 0);
    line(0, 0, 0, 0, width, 0);
    line(0, 0, 0, 0, 0, width);
    stroke(150);
    strokeWeight(1);
    for (int i=1; i<6; i++) {
      line(i*width/5, 0, 0, i*width/5, width, 0);
      line(0, i*width/5, 0, width, i*width/5, 0);
    }
    lights();
    noStroke();
    fill(255, 0, 0);
    sphereDetail(10);

    //**The problem is here**
    for (int i=0; i < pointList.size(); i++) {
      PVector V = pointList.get(i);
      V.x = map(V.x, minX-50, minX+range+50, 0, width);
      V.y = map(V.y, minY-50, minY+range+50, 0, width);
      V.z = map(V.z, minZ-50, minZ+range+50, 0, width);
      pushMatrix();
      translate(V.x, V.y, V.z);
      sphere(4);
      popMatrix();
    }
}

void importTextFile() {   
       String[] strLines = loadStrings("positions.txt");
       for (int i = 0; i < strLines.length; ++i) {
         String[] arrTokens = split(strLines[i], ',');      
         float xx = float(arrTokens[2]);                     
         float yy = float(arrTokens[1]);                    
         float zz = float(arrTokens[0]);                     
         pointList.add( new PVector(xx,zz,yy) );             
       }
    }

最佳答案

您可以继续重构,我不知道为什么他们在处理文档中显示这种迭代 ArrayList 的方式,但这里是重构它的尝试:

float calcV (float n) {
  return map (n, minX-50, minX+range+50, 0, width);
}

for (PVector V: pointList) {
  pushMatrix();
    translate(calcV(V.x), calcV(V.y), calcV(V.z));
    sphere(4);
  popMatrix();
}

您可能会考虑创建一个新类,并将 PVector 作为字段或扩展 PVector。 Daniel Shiffman 经常使用这种模式。创建一个类,其中一个 PVector 用于位置,另一个用于速度,一个方法用于计算每帧的新位置,另一个用于将其绘制到屏幕上。这为您提供了很大的灵活性,而无需编写大量循环(除了计算和显示 ArrayList 中的对象之外)。

关于java - 如何使用 ArrayList.get()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838773/

相关文章:

java - 使用递归分治算法计算整数幂

java - Java中将xml文档转换为字节数组

java - JVM 如何确保 System.identityHashCode() 永远不会改变?

java - 没有 block 处理的Spring Batch步骤

javascript - 图像未出现...JS (p5.js)

java - 是否可以将类型的协变与抽象工厂模式一起使用

java - Spring MVC + hibernate : Partial model update from browser

java - 从中心点分布形状

java - 使用处理实现用于聚光的 GLSL 着色器

java - 按名称排序文件返回未排序的数组