# Derby.frink

``` /** This file converts between x,y coordinates and "track" coordinates for     Womens' Flat-Track Roller Derby.  The layout for the track is specified in     the document:  Appendix A:  WFTDA Track Design and Specifications, which     is available at:     http://static.wftda.com/rules/wftda-rules-appendix-a-track-design.pdf     The [x,y] coordinates are coordinates obtained from looking down on the     track from above, with the curves at top and bottom, as demonstrated in     Figure 1 of the above document, with the center of the track at [0,0]     and the jammer and pivot lines on the right.  The [x,y] coordinates are in     feet, with x increasing to the right, and y increasing downwards.     The [w,d] coordinates are values of my own devising where w is the     sideways distance along the track, going from w=0 on the inside of the     in-bounds track to w=1 on the outside of the in-bounds track.  The d     coordinate is the distance along the track in feet, with the nominal     distance around curves being defined in an interesting and     not-very-obvious way that falls out of the track definition rules.  This     will be discussed in more detail later.     The jammer line is at d=5.     The pivot line is at d=35, which is the exact beginning of the "first     curve".     In the [w,d] coordinate system, the first straightaway has its beginning     at d=0, which is 5 feet behind the jammer line.  The "first curve" means     the entire first curved section of the track after this, or the top curve     in Figure 1 or 2 of the aforementioned WFTDA document.     In the [w,d] coordinate system:     * The first straightaway runs from d=0 to Derby.d1     * The first curve runs from Derby.d1 to Derby.d2     * The second straightaway runs from Derby.d2 to Derby.d3     * The second curve runs from Derby.d3 to Derby.d4     (Exact constants for these distances can be obtained from the program     below.)     This file contains conversion routines for converting between [x,y] and     [w,d] coordinate systems.  The [x,y] system is useful for, say,     determining where to draw a skater on the track, or finding out where a     user clicked, and the [w,d] coordinates are good for simulating motion     along the in-bounds section of the track.  The side-to-side position along     the track is given by varying w from 0 to 1, and the forward motion along     the track is given by varying d from 0 to Derby.d4, which indicates a     complete loop around the track.     Many more explanations of the coordinate systems and the internal     variables are forthcoming.  These may require a vast treatise on the     oddities that the track layout rules imply.     Thanks very much to Denise Dambrackas/"Fawn Stalking" of the Denver Roller     Dolls for expert discussion of rules and layout, and general awesomeness. */ class Derby {    /** Length of a straightaway. */    class var straightaway = 35        /** Inner radius of curves. */    class var inR = 12.5    /** Length of inner arc */    class var inArc = inR pi    /** This is the angle that is generated between 10 foot lines in curves if        the rules in Appendix B:  WFTDA Track Design and Specifications are        followed.        Calculated value = 32.71940 degrees.    */    class var tenFootAngle = 2 arcsin[((7 feet + 1/2 in)/feet)/(2 inR)]    /** This calculation reverse-engineers the radius of the track for which the        10-foot lines in the curves are actually 10 feet apart.        Calculated value:  17.511254 ft    */    class var effectiveRadius = 10 / tenFootAngle    /** This is the effective length of each curve if you follow a path where        the 10-foot lines in the curves are actually 10 feet apart.        Calculated value:  55.0132277 ft    */    class var midArc = effectiveRadius pi    /** This is the effective w-coordinate of the effective 10-foot-line.        Calculated value:  0.3579467 */    class var effectiveW = (effectiveRadius-inR)/14    /** d of end of first straightaway.  Calculated value:  d1 = 35 */    class var d1 = straightaway    /** d of end of first curve.         Calculated value:  d2 = 90.0132277 */    class var d2 = d1 + midArc    /** d of end of second straightaway. Calculated value:  d3 = 125.0132277 */    class var d3 = d2 + straightaway    /** d of end of second curve         Calculated value:  d4 = 180.0264554        This is the effective length of the track if you follow the        "effectiveW" path where the 10-foot lines are actually spaced at        10-foot intervals around the curve. */    class var d4 = d3 + midArc    /** Convert from x,y coordinates to w,d coordinates */    class XYtoWD[x,y] :=    {       if y < -17.5               // First curve       {          theta = arctan[-(y+17.5), x]          r = sqrt[x^2 + (y+17.5)^2]          w = (r - 12.5) / (13 + 2 theta / pi)          d = d1 + effectiveRadius theta          return [w, d]       }       if y > 17.5               // Second curve       {          theta = arctan[y-17.5,-x]          r = sqrt[x^2 + (y-17.5)^2]          w = (r-12.5) / (13 + 2 theta / pi)          d = d3 + effectiveRadius theta          return [w, d]       }       if x > 0                              // First straight           return [(x-12.5)/(y/17.5 + 14),   // w                    17.5 - y]                // d       else                                        // second straight          return [-(12.5 + x) / (-y/17.5 + 14),   // w                  d2 + y + 17.5]                  // d    }    /** Convert from w,d coordinates to x,y coordinates. */    class WDtoXY[w, d] :=    {       d = d mod d4       // First straight       if d < d1          return [12.5 + (15 - d/17.5) w,             // x                  17.5 - d]                           // y       // First curve       if d < d2       {          theta = (d - d1) / effectiveRadius          r = 12.5 + w (13 + 2 theta/pi)          inside = cos[theta]^2 sqrt[r^2 sec[theta]^2 tan[theta]^2]                    // Cotangent goes to infinity around 0 and pi, so work around it          if abs[theta] < 1e-6             return[12.5 + 13 w, -17.5]          if abs[theta-pi] < 1e-6             return[-12.5 - 15 w, -17.5]                 x =  cot[theta] inside          y = -17.5 - inside          return [x,y]       }       // Second straight       if (d < d3)       {          x = -12.5 + 1/35 (2 d - 2 d2 - 525) w          y = d - d2 - 17.5          return [x,y]       }       // Second curve       theta = (d - d3) / effectiveRadius       // Cotangent goes to infinity around 0 and pi, so work around it       if abs[theta] < 1e-6          return[-12.5 - 13 w, 17.5]       if abs[theta-pi] < 1e-6          return[12.5 + 15 w, 17.5]              r = 12.5 + w (13 + 2 theta/pi)       inside = cos[theta]^2 sqrt[r^2 sec[theta]^2 tan[theta]^2]       x = -cot[theta] inside       y = 17.5 + inside       return [x,y]    } } ```

This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 18658 days, 12 hours, 10 minutes ago.