# greatCircleMap.frink

``` /** This program demonstrates the use of the country polygons in     Countries.frink to draw a map of the world.  It can be readily altered to     draw the map in your favorite projection. */ use Country.frink use geometry.frink use navigation.frink g = new graphics g.stroke g.color[.8,.9,1] g.fillEllipseCenter[0, 0, 2 pi earthradius / km , 2 pi earthradius / km] myLat = 40 degrees North myLong = 105 degrees West // Iterate through all countries. for [code, country] = Country.getCountryList[] {    cc = new color[randomFloat[.2,.9], randomFloat[.2,.9], randomFloat[.2,.9], .8]    firstPolygon = true    for poly = country.borders  // Iterate through polygons in a country.    {       p = new filledPolygon   // This polygon is the filled country       po = new polygon        // This is the outline of the country       // Some countries consist of many polygons.  Only label the first one       // (which is sorted in Countries.frink to be the largest.)       if firstPolygon          transformedPolygon = new array              for [long, lat] = poly  // Iterate through points in polygon       {          [x,y] = latLongToXY[myLat, myLong, lat degree, long degree]          p.addPoint[x, y]          po.addPoint[x, y]          if firstPolygon             transformedPolygon.push[[x,y]]       }       // Draw filled countries       g.color[cc]       g.add[p]       // Draw country outlines       g.color[0.2,0.2,0.2,.8]       g.add[po]       // Draw country names.       if firstPolygon       {          area = polygonArea[transformedPolygon]          [cx, cy] = polygonCentroid[transformedPolygon]          g.color[0,0,0]                    // Do some contortions to try and size the country name          longestWord = max[map[getFunction["length",1],                                 split[%r/\s+/, country.name]]]          countryName = country.name =~ %s/\s+/\n/g   // Wrap country name          g.font["SansSerif", "bold", 6 (sqrt[area] / longestWord)^(0.7)]          g.text[countryName, cx, cy, arctan[cx,cy] + 180 deg]          firstPolygon = false       }    } } // Draw distance circles g.stroke g.color[0,0,0] for distance = 0 km to pi earthradius step 1000 miles    g.drawEllipseCenter[0, 0, 2 distance / km, 2 distance / km] // Draw bearing lines g.font["SansSerif", "bold", 600] for bearing = 0 degrees to 359 degrees step 10 degrees {    x =  pi earthradius sin[bearing] / km    y = -pi earthradius cos[bearing] / km    g.line[0, 0, x, y]    g.text[round[bearing/deg] /* + "\u00B0"*/, x , y, "center", "baseline", -bearing] } g.stroke // Draw single degree ticks for bearing = 0 to 359 {    x1 =  pi earthradius sin[bearing degrees] / km    y1 = -pi earthradius cos[bearing degrees] / km    x2 =  12000 miles sin[bearing degrees] / km    y2 = -12000 miles cos[bearing degrees] / km    g.line[x1, y1, x2, y2] } g.show g.write["greatCircle.svg", 1000, 1000] g.write["greatCircle.png", 1000, 1000] latLongToXY[myLat, myLong, lat, long] := {    [distance, bearing] = earthDistanceAndBearing[myLat, myLong, lat, long]        d1 = distance / km    y = -d1 cos[bearing]    x = d1 sin[bearing]    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 18377 days, 1 hours, 22 minutes ago.