How do I create symmetrical bands on both sides of a curve? I am playing with Amazon's DeepRacer, which is a sort of intro into machine learning where you train a car to drive around a track.
An input to the program is an ordered list of waypoints that form the track. Another input is the width of the track. Using these inputs, I'd like to be able to generate the inner and outer bounds of the track, but I am struggling.
An example of a track, showing data points for the center, inner bound, and outer bound:

A zoomed in view of the chicane on the top of the track:

Given just the dataset represented by the blue dots, how can I generate the data represented in green and orange? I have tried a couple of different methods that just are not working out.
Specifically, I have tried using the arctangent to determine the angles from each waypoint to the next, and then trying to place points on both sides of a line that bisects that angle. That seems like a pretty simple approach, but I just can not seem to get it right. How would you approach this problem?
 A: Given a (blue) curve $\mathbf{r}(t)=(x(t),y(t))$, then $(x'(t),y'(t))$ is its tangent and $(y'(t),-x'(t))$ is a normal vector, made unit as $\mathbf{n}=\frac{(y'(t),-x'(t))}{\sqrt{x'(t)^2+y'(t)^2}}$. Hence the green and yellow curves are given by $$\mathbf{u}_{\pm}(t):=\mathbf{r}(t)\pm \epsilon\,\mathbf{n}(t)$$ However, if you plot these curves directly, the dots will not be equally spaced. So let $s_\pm(t):=\int^t\sqrt{x'(t)^2+y'(t)^2}\,dt$ be the arclength function of $\mathbf{u}_\pm(t)$ and reparametrize $\mathbf{u}$ in terms of $s$, then plot $\mathbf{u}_\pm(ns_0)$.
Here's some pseudo-code to achieve this ($x(t),y(t),x'(t),y'(t),x''(t),y''(t)$ should be given or calculated before-hand):
Parameters: 
e (= distance of green/yellow curves from blue curve),
T0, T1, dt (= starting/ending values of t, with increment dt),
s0 (= distance between points)

sum[0]=0; sum[1]=0; sum[2]=0;
for t=T0 to T1 step dt:
   x=x(t); y=y(t); xt=x'(t); yt=y'(t); xtt=x''(t); ytt=y''(t);
   s = sqrt(xt*xt + yt*yt);

   x1 = x + e*yt/s; y1 = y - e*xt/s;
   xt1 = xt + e*(ytt/s-yt/(2*s*s*s)); yt1 = yt + e*(-xtt/s + xt/(2*s*s*s));
   s1 = sqrt(xt1*xt1 + yt1*yt1);

   x2 = x - e*yt/s; y1 = y + e*xt/s;
   xt2 = xt - e*(ytt/s-yt/(2*s*s*s)); yt2 = yt - e*(-xtt/s + xt/(2*s*s*s));
   s2 = sqrt(xt2*xt2 + yt2*yt2);

   sum[0] += s*dt; sum[1] += s1*dt; sum[2] += s2*dt;
   if(sum[0]>=s0): plot blue point(x,y); sum[0]=0;
   if(sum[1]>=s0): plot green point(x1,y1); sum[1]=0;
   if(sum[2]>=s0): plot yellow point(x2,y2); sum[2]=0;

