# anamorph.frink

``` // This performs anamorphic projections of coordinates. // // See: // Anamorphic images, J. L. Hunt, B. G. Nickel, and Christian Gigault // Am. J. Phys., Vol. 68, No.3, March 2000 // // https://web.archive.org/web/20110220054127/http://www.physics.uoguelph.ca/phyjlh/morph/Anamorph.pdf // projectCylindrical[x1, y1, radius, distance, height] := {    if x1 conforms radius       x = x1 / radius    else       x = x1    if y1 conforms radius       y = y1 / radius    else       y = y1        d = distance / radius    h = height / radius    alpha = arctan[h,d]    // Planar projections    yp = (y/sin[alpha])/(1-(y/h)cos[alpha])  // Eq. 2    xp = x/sqrt[h^2 + d^2 + y^2] * sqrt[h^2+(d+yp)^2]   // Eq. 3, rearranged    //println["xp,yp=\$xp,\$yp"]        // Eq.6    cospsi = (d xp^2+(d+yp) sqrt[d^2 (1-xp^2) + 2 d yp + xp^2 + yp^2]) / ((d+yp)^2 + xp^2)    xpp = xp + 2xp / (d+yp) (cospsi + yp)(d cospsi - 1)  // Eq. 7    ypp = -yp + 2 cospsi (cospsi + yp)((d cospsi-1)/(d-cospsi)) // Eq. 8    //println["xpp,ypp=\$xpp,\$ypp"]    if x1 conforms radius       xpp = xpp * radius    if y1 conforms radius       ypp = ypp * radius    return[xpp, ypp] } // Draw a coordinate system, not viewed from an infinite distance, with // the following parameters. radius = 1.5 in distance=15 in height=10 in g = new graphics g.font["SansSerif",0.1 in] g.stroke[.02 in] g.color[0,0,0,.2] for x=-radius to radius step radius/20 {    p = new polyline    for y = -2 in to 4 in step .1 in    {       [xpp, ypp] = projectCylindrical[x,y,radius,distance,height]       if ! (isComplex[xpp] or isComplex[ypp] or (xpp^2 + ypp^2 < radius^2))       { //         g.text["\$x,\$y",xpp,ypp]          p.addPoint[xpp,ypp]       }    }    g.add[p] } for y = -2 in to 4 in step .1 in {    p = new polyline    for x=-radius to radius step radius/20    {       [xpp, ypp] = projectCylindrical[x,y,radius,distance,height]       if ! (isComplex[xpp] or isComplex[ypp])          p.addPoint[xpp,ypp]    }    g.add[p] } // Draw where the cylinder goes g.color[1,0,0] g.drawEllipseCenter[0 radius,0 radius,2 radius, 2 radius] g.show[] // g.print[] // Draw a spiral. g = new graphics radius = 1.5 in distance = 15 in height = 10 in turns = 5 p = new polyline for angle = 0 degrees to circle turns step 1 degree {    [xpp, ypp] = projectCylindrical[.9 cos[angle] radius (angle/(circle turns)), .9 (sin[angle]) radius (angle/(circle turns)) + 1 in, radius, distance, height]    p.addPoint[xpp,ypp] } // Draw the cylinder's location g.stroke[1 cm] g.add[p] g.color[1,0,0] g.drawEllipseCenter[0 radius,0 radius,2 radius, 2 radius] g.show[] //g.printTiled[2,2] ```

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 18369 days, 18 hours, 25 minutes ago.