From: <hez...@us...> - 2009-08-04 01:41:35
|
Revision: 10207 http://plplot.svn.sourceforge.net/plplot/?rev=10207&view=rev Author: hezekiahcarty Date: 2009-08-04 01:41:21 +0000 (Tue, 04 Aug 2009) Log Message: ----------- Update C example 19 to use custom axis labels for longitude and latitude Modified Paths: -------------- trunk/examples/c/x19c.c Modified: trunk/examples/c/x19c.c =================================================================== --- trunk/examples/c/x19c.c 2009-08-04 01:38:53 UTC (rev 10206) +++ trunk/examples/c/x19c.c 2009-08-04 01:41:21 UTC (rev 10207) @@ -28,6 +28,65 @@ } } +/* "Normalize" longitude values so that they always fall between -180.0 and + 180.0 */ +PLFLT normalize_longitude(PLFLT lon) { + PLFLT times; + if (lon >= -180.0 && lon <= 180.0) { + return(lon); + } + else { + times = floor ((fabs(lon) + 180.0) / 360.0); + if (lon < 0.0) { + return(lon + 360.0 * times); + } + else { + return(lon - 360.0 * times); + } + } +} + +/* A custom axis labeling function for longitudes and latitudes. */ +void +geolocation_labeler(PLINT axis, PLFLT value, const char *label, PLPointer data) { + const char *direction_label; + char *custom_label; + PLFLT label_val; + + if (axis == PL_Y_AXIS) { + label_val = value; + if (label_val > 0.0) { + direction_label = " N"; + } + else if (label_val < 0.0) { + direction_label = " S"; + } + else { + direction_label = "Eq"; + } + } + else if (axis == PL_X_AXIS) { + label_val = normalize_longitude(value); + if (label_val > 0.0) { + direction_label = " E"; + } + else if (label_val < 0.0) { + direction_label = " W"; + } + else { + direction_label = ""; + } + } + if (axis == PL_Y_AXIS && value == 0.0) { + /* A special case for the equator */ + sprintf(custom_label, "%s", direction_label); + } + else { + sprintf(custom_label, "%.0f%s", fabs(label_val), direction_label); + } + label = custom_label; +} + /*--------------------------------------------------------------------------*\ * main * @@ -56,8 +115,11 @@ minx = 190; maxx = 190+360; + /* Setup a custom latitude and longitude-based scaling function. */ + plslabelfunc(geolocation_labeler, NULL); + plcol0(1); - plenv(minx, maxx, miny, maxy, 1, -1); + plenv(minx, maxx, miny, maxy, 1, 70); plmap(NULL, "usaglobe", minx, maxx, miny, maxy); /* The Americas */ @@ -66,9 +128,12 @@ maxx = 340; plcol0(1); - plenv(minx, maxx, miny, maxy, 1, -1); + plenv(minx, maxx, miny, maxy, 1, 70); plmap(NULL, "usaglobe", minx, maxx, miny, maxy); + /* Clear the labeling function */ + plslabelfunc(NULL, NULL); + /* Polar, Northern hemisphere */ minx = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |