t0.turn(-90);
t1.turn(90);
t0.move(r.width*6);
t1.move(r.width*6);
LineSegment ls0 = new LineSegment(t0Start, t0.pos);
LineSegment ls1 = new LineSegment(t1Start, t1.pos);
segments0.add(ls0);
segments1.add(ls1);
}
//compute intersections of roads extruded from center of intersection.
double[] extrusion = new double[is.connecting.size()];
//double maxDistance = -1;
for(int j=0; j<is.connecting.size(); j++){
for(int k=0; k<is.connecting.size(); k++){
if(j != k){
Coordinate c0 = segments0.get(j).intersection(segments1.get(k));
Coordinate c1 = segments1.get(j).intersection(segments0.get(k));
if(c0 != null){
double dist = c0.distance(is.pos);
if(dist>extrusion[j]){
extrusion[j] = dist;
log.log("dist: "+dist+" other");
}
}
if(c1 != null){
double dist = c1.distance(is.pos);
if(dist>extrusion[j]){
extrusion[j] = dist;
}
}
}
}
if(extrusion[j] < maxRadius) extrusion[j] = maxRadius;
for(int k=0; k<is.connecting.size(); k++){
if(is.connecting.get(k).a == is){
is.connecting.get(k).roadExtrusionA = extrusion[k];
}else{
is.connecting.get(k).roadExtrusionB = extrusion[k];
}
}
}
//create final road extrusion
LineSegment[] segments = new LineSegment[is.connecting.size()];
for(int j=0; j<is.connecting.size(); j++){
Road r = is.connecting.get(j);
double radius = r.width/2; //maybe a tad faster to load into variable?
Turtle t0;
if(r.a.pos.equals(is.pos)){
t0 = new Turtle(is.pos, Math.toDegrees(Angle.angle(is.pos, r.b.pos)));
}else{
t0 = new Turtle(is.pos, Math.toDegrees(Angle.angle(is.pos, r.a.pos)));
}
//move out from intersection and split into road width
t0.move(extrusion[j]);
t0.turn(90);
Turtle t1 = new Turtle(t0.pos, t0.angle-180);
t0.move(radius);
t1.move(radius);
segments[j] = new LineSegment(t0.pos, t1.pos);
}
//need to sort segments by angle order, then use that to generate shape. Convex hull will not work.
double[] angles = new double[segments.length]; //no ring, so no last element
//calculate all point angles
for(int j=0; j<angles.length; j++) angles[j] = Math.min(Math.PI*2-Angle.angle(is.pos, segments[j].p0),Math.PI*2-Angle.angle(is.pos, segments[j].p1));
//selection sort
for(int j=0; j<angles.length; j++){
int min = j;
for(int k=j+1; k<angles.length; k++){
if(angles[k]<angles[min]){
min = k; //remember new min
}
}
//swap min element with current element
if(min != j){
//swap angle array
double ang = angles[j];
angles[j] = angles[min];
angles[min] = ang;
//swap segment array
LineSegment tempS = segments[j];
segments[j] = segments[min];
segments[min] = tempS;
}
}
//close ring