Thanks a lot! I understand what you said, and I think I implemented some improvements. However, now I get nullpointerexceptions on the call to r(coordinates.size()-1);
Can I not use the method to draw in such a way?
Here is my current sketch:
import processing.serial.*;
import java.util.List;
import java.util.ArrayList;
String val; // Data received from the serial port
Serial serialConnectionObject;
int serialChannelIndexInt;
float lat;
float lng;
int rectSizeX = 40 ;
int rectSizeY = 40;
float latcoord = 0;
float longcoord = 0;
boolean newData = false;
float xCoord, yCoord, oldxCoord, oldyCoord;
List<deltaXY> coordinates;
float x, y, traceX, traceY;
deltaXY dXY;
JSONObject json;
void setup()
{
size(400,400);
background(0);
InitSerialConnectionVoid(0);
String portName = Serial.list()[serialChannelIndexInt]; //change the 0 to a 1 or 2 etc. to match your port
println(portName);
serialConnectionObject.bufferUntil('\n');
x = 0.5 * width;
y = 0.5 * height;
dXY = new deltaXY();
noLoop();
}
void draw()
{ try {
json = parseJSONObject(val);
}
catch(Exception e) {
e.printStackTrace();
}
if (json == null) {
newData = false;
} else {
println(json.toString());
lat = json.getFloat("lat");
lng = json.getFloat("lng");
println(lat);
oldxCoord = xCoord;
oldyCoord = yCoord;
LatLngtoXY(lat,lng);
dXY.setDX(xCoord, oldxCoord);
dXY.setDY(yCoord, oldyCoord);
try {
coordinates.add(dXY);
}
catch(Exception e) {
e.printStackTrace();
}
fill(#FFFFFF, 10);
noStroke();
rectMode(CENTER);
r(coordinates.size()-1);
if (coordinates.size() >=100) {
coordinates.remove(0);
}
//newData=true;
}
}
void serialEvent(Serial p) {
try {
println("test");
val = p.readString();
println(val);
if(val != null) {
redraw();
}
}
catch(RuntimeException e) {
e.printStackTrace();
}
}
void r(int i) {
if (i==0) {
fill(#FFFFFF, 10);
noStroke();
rectMode(CENTER);
rect(x, y, rectSizeX, rectSizeY);
} else {
float dx = coordinates.get(i).getDX();
float dy = coordinates.get(i).getDY();
traceX += dx;
traceY += dy;
fill(#FFFFFF, 50);
noStroke();
//rectMode(CENTER);
rect(x+traceX, y+traceY, rectSizeX, rectSizeY);
println(traceX,traceY);
r(i-1);
}
}
void LatLngtoXY(float lat, float lon) {
float mapWidth = width;
float mapHeight = height;
// get x value
xCoord = (lon+180)*(mapWidth/360);
// convert from degrees to radians
float latRad = lat*PI/180;
// get y value
float mercN = log(tan((PI/4)+(latRad/2)));
yCoord = (mapHeight/2)-(mapWidth*mercN/(2*PI));
}
void InitSerialConnectionVoid(int _serialChannelIndexInt){
serialChannelIndexInt = _serialChannelIndexInt;
if(serialChannelIndexInt == Serial.list().length){ return; }
try{
serialConnectionObject = new Serial(this, Serial.list()[serialChannelIndexInt], 115200);
serialConnectionObject.bufferUntil('\n');
}
catch (RuntimeException e){
serialConnectionObject = null;
println(e);
println("SERIAL CONNECTION FAILED");
InitSerialConnectionVoid(serialChannelIndexInt + 1);
}
}
class deltaXY {
float dx;
float dy;
deltaXY() {
}
public void setDX(float xCoord, float oldxCoord) {
this.dx = xCoord-oldxCoord;
}
public void setDY(float yCoord, float oldyCoord) {
this.dy = yCoord-oldyCoord;
}
public float getDX() {
return this.dx;
}
public float getDY() {
return this.dy;
}
}