Search code examples
processingstoragepointclicking

How can I create points, display them and store them in some sort of Array


I want to create points and then store them in an array. I'm doing this to put a linear regression through my data points afterwards. So I need to be able to cycle through all my points.

I could not find anything like that on the web for processing and as I was not really able to do it, I need your help. Here is my approach, but it doesn't seem to work:

ArrayList<dataPoint> dataPoints = new ArrayList<dataPoint>();

void setup(){
  size(1000, 1000); 
  background(255);
}
void draw(){
  for (int i = 1; i == dataPoints.size(); i++) { 
    // An ArrayList doesn't know what it is storing so we have to cast the object coming out
    dataPoint Point = dataPoints.get(i);
    Point.display();

  }  
}

void mousePressed() {
  dataPoints.add(new dataPoint(mouseX, mouseY));
}

class dataPoint {

  float x;
  float y;

  dataPoint(int tempX, int tempY) {
    x = tempX;
    y = tempY;
  }

  void display() {
    strokeWeight(10);
    stroke(255,0,0);
    point(x,y);
  }
} 

I would like to have a program to create points and store them in an array (or something similar, that you can cycle through).


Solution

  • Most of your code makes sense, there are only two gotchas I could spot that may prevent you from cycling through all your points and visualising them:

    1. your condition is will go to an array index out of bounds: try for (int i = 0; i < dataPoints.size(); i++)
    2. remember to clear the frame, otherwise you're drawing on top of the same dots over and over again

    Remember array indices start at 0 in Processing/Java (and likewise the last index will not be the size() of your array, but the 1 less, hence the < in the for condition)

    Here is your code with the above tweaks:

    ArrayList<dataPoint> dataPoints = new ArrayList<dataPoint>();
    
    void setup(){
      size(1000, 1000); 
    
    
    }
    void draw(){
      background(255);
      for (int i = 0; i < dataPoints.size(); i++) { 
        // An ArrayList doesn't know what it is storing so we have to cast the object coming out
        dataPoint Point = dataPoints.get(i);
        Point.display();
    
      }  
    }
    
    void mousePressed() {
      dataPoints.add(new dataPoint(mouseX, mouseY));
    }
    
    class dataPoint {
    
      float x;
      float y;
    
      dataPoint(int tempX, int tempY) {
        x = tempX;
        y = tempY;
      }
    
      void display() {
        strokeWeight(10);
        stroke(255,0,0);
        point(x,y);
      }
    } 
    

    Note that Processing has a handy PVector class (which has x,y properties) so you could do something like this:

    ArrayList<PVector> dataPoints = new ArrayList<PVector>();
    
    void setup(){
      size(1000, 1000); 
      strokeWeight(10);
      stroke(255,0,0);
      noFill();
    }
    void draw(){
      background(255);
      beginShape();
      for (int i = 0; i < dataPoints.size(); i++) { 
        PVector point = dataPoints.get(i);
        vertex(point.x,point.y);
      }  
      endShape();
    }
    
    void mousePressed() {
      dataPoints.add(new PVector(mouseX, mouseY));
    }
    

    This a bit of a detail, but I recommend to following Java Naming Convention to keep the code consistent. (For example: renaming the dataPoint class to DataPoint and renaming the Point instance to point)