# How to store random coordinates?

I would like to arrange some spheres randomly in space. To do that I run the following:

``````import peasy.*;
PeasyCam cam;

void setup(){
size(1300, 1300, P3D);
cam = new PeasyCam(this, 200);

randomSeed(0);

float posx=random(-50, 50);
float posy=random(-50, 50);
float posz=random(-50, 50);

}

void draw() {
background(0);

for (int i=0; i < numRows; i ++) { // where numRows is defined somewhere and are some values that I loop over to determine the size of the sphere
pushMatrix();
lights();
translate(posx, posy, posz);
sphere(50); // in my code, the size of the sphere is determined by some imported values
popMatrix();
}
``````

But I donâ€™t know to store the values in an array so I can access them in my for loop one by one and determine a random position. Is there a remedy? Thank you!

2 Likes

Look at ArrayList and set one up to type PVector
(before `setup()`)

Then in a for loop make PVectors and add them to the arraylist
(All in `setup()`)

In draw() read and show arraylist

See reference ArrayList

Example

``````

import peasy.*;
PeasyCam cam;

ArrayList<PVector> list = new ArrayList();

void setup() {
size(1300, 1300, P3D);
cam = new PeasyCam(this, 200);

// randomSeed(0);

for (int i=0; i<5; i++) {
float posx=random(0, 150);
float posy=random(0, 150);
float posz=random(-450, 0);
}
}

void draw() {
background(0);
lights();

noStroke();
fill(255, 0, 0);

for (PVector pv : list) {
pushMatrix();
translate(pv.x, pv.y, pv.z);
sphere(14);
popMatrix();
}
}

``````
3 Likes

Awesome, thanks!

One follow-up question:

In this for-loop

``````for (PVector pv : list) {
pushMatrix();
translate(pv.x, pv.y, pv.z);
sphere(14);
popMatrix();
}
``````

How could I use the loop index (pv) to extract elements from an IntList that Iâ€™ve defined outside of the loop?

When I run the following

``````float var = map(myIntList.get(pv), 0, 10000000000, 0, 100);
``````

I get the error: The function â€śget()â€ť expects parameters like: â€śget(int)â€ť

Thank you!

When you want it in the same for loop and both lists have the same length use a conventional for loop with i and use get(i) on both lists

2 Likes

Alternatively you can use an int i and say i++; in the for loop

So Iâ€™m using the conventional for loop but when I run the following

``````    translate(list.x, list.y, list.z);
``````

I get the error â€śThe global variable â€śxâ€ť does not existâ€ť (same for y and z). Why is that?

say list.get(i).x

For all 3 elements

2 Likes

Itâ€™s aliiiive! Thank you

2 Likes

A bit of help with ArrayLists;

``````ArrayList<Integer> abc = new ArrayList<Integer>();
println(abc.get(0)*2); //it acts the same as int value = 123;
``````

essentially `ArrayListName.get(<id>) ` acts the same as varriableName.

It helps if you want to do something like:

``````ArrayList<ArrayList<Float>> info = new ArrayList<ArrayList<Float>>();
``````

Thanks.

If I could just ask a follow-up question. I would like to be able to retrieve a name for each of my x, y, z coordinates.

Something like

``````String name = myTable.getString(i, 0);
float posx=random(0, 150);
float posy=random(0, 150);
float posz=random(0, 150);
``````

Iâ€™d like to store these in some sort of array so that I can access the coordinates together with the name. But I see that Arrays and ArrayLists are type specific. Is there a datatype that is not type specific? Or is there a smarter way to access the name-coordinate pairs later in my code?

Thanks!

You can store 3 coordiantes in the PVector class. It is in the format `new PVector(x,y,z)`.

To access it use:

``````float x = 123, y = 321, z = -333;
PVector pos = new PVector(x,y,z);
//or in ArrayList form
ArrayList<PVector> list = new ArrayList<PVector>();
square(list.get(i).x,list.get(i).y,sphere.get(i).z);
``````

In the PVector class, you can essentially store 3 float values.

The only minor â€śissueâ€ť with PVectors is that you cannot use

``````PVector pos = 1,5,-4; //this will not work
//you have to use:
PVector pos = new PVector(1,5,-4);
``````

I see, I understand the PVector part. What if I wanted to link a name to each PVector? So that it kind of looks like this

``````name1 posx1 posy1 posz1
name2 posx2 posy2 posz2
name3 posx3 posy3 posz3
...
``````

I donâ€™t fully understand, butâ€¦

``````PVector name1 = new PVector(posx1,posy1,posz1);
PVector name2 = new PVector(posx2,posy2,post2);
PVector name3 = new PVector(posx3,posy3,posz3);

//to get varriables use
float posx1 = name1.x;
float posy1 = name1.y;
float posz1 = name1.z;

float posx2 = name2.x;
float posy2 = name2.y;
float posz2 = name2.z;

float posx3 = name3.x;
float posy3 = name3.y;
float posz3 = name3.z
``````

You need to make a class

``````class MyPoint {
PVector pvPoint;
String namePoint;
}
``````

Then the Arraylist ist of type MyPoint
`ArrayList<MyPoint > list = new ....`

Then itâ€™s e.g. `println(list.get(3).namePoint);`