blob: 38f89b95d0d19bec9436b414f0ee29312779310b [file] [log] [blame]
// build_intersection.cc
#include "intersection.h"
#include <cstdlib>
#include <cstring>
void intersection_4x4::connectNin (roadlet *leftlane, roadlet *rightlane)
{
connect(leftlane, S, roadlets[0][1], N, (filter_fn)green_light);
connect(rightlane, S, roadlets[0][0], N, (filter_fn)green_OR_plan_rightONred);
}
void intersection_4x4::connectEin (roadlet *leftlane, roadlet *rightlane)
{
connect(leftlane, W, roadlets[1][3], E, (filter_fn)green_light);
connect(rightlane, W, roadlets[0][3], E, (filter_fn)green_OR_plan_rightONred);
}
void intersection_4x4::connectSin (roadlet *leftlane, roadlet *rightlane)
{
connect(leftlane, N, roadlets[3][2], S, (filter_fn)green_light);
connect(rightlane, N, roadlets[3][3], S, (filter_fn)green_OR_plan_rightONred);
}
void intersection_4x4::connectWin (roadlet *leftlane, roadlet *rightlane)
{
connect(leftlane, E, roadlets[2][0], W, (filter_fn)green_light);
connect(rightlane, E, roadlets[3][0], W, (filter_fn)green_OR_plan_rightONred);
}
void intersection_4x4::connectNout(roadlet *leftlane, roadlet *rightlane)
{
connect(roadlets[0][2], N, leftlane, S,(filter_fn) strait);
connect(roadlets[0][3], N, rightlane, S, (filter_fn)strait_or_right);
}
void intersection_4x4::connectEout(roadlet *leftlane, roadlet *rightlane)
{
connect(roadlets[2][3], E, leftlane, W, (filter_fn)strait);
connect(roadlets[3][3], E, rightlane, W, (filter_fn)strait_or_right);
}
void intersection_4x4::connectSout(roadlet *leftlane, roadlet *rightlane)
{
connect(roadlets[3][1], S, leftlane, N, (filter_fn)strait);
connect(roadlets[3][0], S, rightlane, N, (filter_fn)strait_or_right);
}
void intersection_4x4::connectWout(roadlet *leftlane, roadlet *rightlane)
{
connect(roadlets[1][0], W, leftlane, E, (filter_fn)strait);
connect(roadlets[0][0], W, rightlane, E, (filter_fn)strait_or_right);
}
intersection_4x4::intersection_4x4(const char *name)
{
char *buff;
int i,j;
light_type *l;
l = new light();
the_light = l;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
{
buff = (char*)malloc(strlen(name) + 7);
sprintf(buff, "%s %d %d", name, i, j);
roadlets[i][j] = new intersection_roadlet(buff, l);
}
for(i=3; i>0; i--)
{
connect(roadlets[i][3], N, roadlets[i-1][3], S, &strait);
connect(roadlets[i][2], N, roadlets[i-1][2], S, &strait);
}
for(i=0; i<3; i++)
{
connect(roadlets[i][0], S, roadlets[i+1][0], N, &strait);
connect(roadlets[i][1], S, roadlets[i+1][1], N, &strait);
}
for(j=0; j<3; j++)
{
connect(roadlets[2][j], E, roadlets[2][j+1], W, &strait);
connect(roadlets[3][j], E, roadlets[3][j+1], W, &strait);
}
for(j=3; j>0; j--)
{
connect(roadlets[0][j], W, roadlets[0][j-1], E, &strait);
connect(roadlets[1][j], W, roadlets[1][j-1], E, &strait);
}
// override center square
// FIX ME i think car can circle forever in the middle of the intersection!
// FIX with PLAN of lefty is strait
connect(roadlets[2][2], N, roadlets[1][2], S, &strait_or_left);
connect(roadlets[1][2], W, roadlets[1][1], E, &strait_or_left);
connect(roadlets[1][1], S, roadlets[2][1], N, &strait_or_left);
connect(roadlets[2][1], E, roadlets[2][2], W, &strait_or_left);
car b("blocker");
b.set_location(roadlets[0][2]); // a car
roadlets[0][2]->arrive(&b);
cout << b << '\n';
}