#include #include #include #include #include #include #ifndef DEGtoRAD #define DEGtoRAD(a) (a * M_PI / 180.0) #endif #define MAJOR_TICK 0.93 #define MINOR_TICK 0.97 #define CHAR_BASELINE 0.78 #define CHAR_WIDTH (0.025 * 3.9) #define FONT_SCALE (0.025 * 3.9) #define LEGEND_TICK 1.1 #define PLANE_HEIGHT 0.4 #define PLANE_WING 0.25 #define PLANE_TAIL 0.13 #define CDI_WIDTH 0.08 #define CDI_HEIGHT 1.00 #define CDI_DOT_RADIUS 0.02 #define CDI_DOT_SPACE 0.125 #define SCP_HEIGHT 0.32 #define SCP_ARROW_START 0.20 #define GS_DOT_RADIUS 0.05 #define GS_DOT_SPACE 0.35 #define GS_Y 1.4 #define VOR_DIR_WIDTH (CDI_WIDTH * 1.7) #define VOR_DIR_HEIGHT (CDI_WIDTH * 1.7 * 0.867) #define VOR_DIR_BASE 0.24 extern void DrawStrokeString(); VGlyphPath paths[1024]; VGlyphVertex3 verticies[4096]; int path_count = 0; int vertex_count = 0; VPoint vertx[16]; int nvert; #define PrintPoint(a,b,c) { vertx[nvert].x = (a); \ vertx[nvert].y = (b); vertx[nvert].z = (c); ++ nvert; } void PrintPath (v, vcnt) VPoint *v; int vcnt; { paths[path_count].vertex_count = vcnt; paths[path_count++].vertex_start = vertex_count; for (; vcnt > 0; --vcnt) { verticies[vertex_count].x = (short) (v->x * UNITY); verticies[vertex_count].y = (short) (v->y * UNITY); verticies[vertex_count++].z = (short) (v->z * UNITY); ++v; } } void Circle (y, z, radius, nseg) double y, z, radius; int nseg; { int i; VPoint pt, first_pt; double a, incr = 360.0 / nseg; pt.x = 1.0; nvert = 0; for (i=0; i\n"); WriteSegmentTables (stdout, "heading"); /* * build the legend */ a.x = b.x = 1.0; for (i=0; i < 8; ++i) { hdg = DEGtoRAD((double) i * 45.0); a.y = sin (hdg); a.z = cos (hdg); b.y = a.y * LEGEND_TICK; b.z = a.z * LEGEND_TICK; nvert = 0; PrintPoint (a.x, a.y, a.z); PrintPoint (b.x, b.y, b.z); PrintPath (vertx, nvert); } nvert = 0; PrintPoint (1.0, CDI_WIDTH / 2.0, PLANE_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, - PLANE_HEIGHT / 2.0); PrintPoint (1.0, PLANE_TAIL, - PLANE_HEIGHT / 2.0); PrintPath (vertx, nvert); nvert = 0; PrintPoint (1.0, - CDI_WIDTH / 2.0, PLANE_HEIGHT / 2.0); PrintPoint (1.0, - CDI_WIDTH / 2.0, - PLANE_HEIGHT / 2.0); PrintPoint (1.0, - PLANE_TAIL, - PLANE_HEIGHT / 2.0); PrintPath (vertx, nvert); nvert = 0; PrintPoint (1.0, CDI_WIDTH / 2.0, PLANE_HEIGHT / 6.0); PrintPoint (1.0, PLANE_WING, PLANE_HEIGHT / 6.0); PrintPath (vertx, nvert); nvert = 0; PrintPoint (1.0, - CDI_WIDTH / 2.0, PLANE_HEIGHT / 6.0); PrintPoint (1.0, - PLANE_WING, PLANE_HEIGHT / 6.0); PrintPath (vertx, nvert); WriteSegmentTables (stdout, "legend"); nvert = 0; PrintPoint (1.0, CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0); PrintPoint (1.0, - CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0); PrintPoint (1.0, - CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0); PrintPath (vertx, nvert); WriteSegmentTables (stdout, "cdi"); nvert = 0; PrintPoint (1.0, CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0 + SCP_ARROW_START); PrintPoint (1.0, 0.0, CDI_HEIGHT / 2.0 + SCP_HEIGHT); PrintPoint (1.0, - CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0 + SCP_ARROW_START); PrintPoint (1.0, - CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, CDI_HEIGHT / 2.0); PrintPath (vertx, nvert); nvert = 0; PrintPoint (1.0, CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0 - SCP_ARROW_START); PrintPoint (1.0, -CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0 - SCP_ARROW_START); PrintPoint (1.0, -CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0); PrintPoint (1.0, CDI_WIDTH / 2.0, - CDI_HEIGHT / 2.0); PrintPath (vertx, nvert); Circle (5.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (- 5.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (4.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (- 4.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (3.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (- 3.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (2.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (- 2.0 * CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); Circle (- CDI_DOT_SPACE, 0.0, CDI_DOT_RADIUS, 8); WriteSegmentTables (stdout, "scp"); Circle (GS_Y, 2.0 * GS_DOT_SPACE, GS_DOT_RADIUS, 8); Circle (GS_Y, - 2.0 * GS_DOT_SPACE, GS_DOT_RADIUS, 8); Circle (GS_Y, GS_DOT_SPACE, GS_DOT_RADIUS, 8); Circle (GS_Y, - GS_DOT_SPACE, GS_DOT_RADIUS, 8); hdg = GS_DOT_RADIUS; nvert = 0; PrintPoint (1.0, GS_Y + hdg, hdg * 0.6); PrintPoint (1.0, GS_Y - hdg, hdg * 0.6); PrintPoint (1.0, GS_Y - hdg, - hdg * 0.6); PrintPoint (1.0, GS_Y + hdg, - hdg * 0.6); PrintPoint (1.0, GS_Y + hdg, hdg * 0.6); PrintPath (vertx, nvert); WriteSegmentTables (stdout, "gs_scale"); hdg = GS_DOT_RADIUS; nvert = 0; PrintPoint (1.0, GS_Y - hdg, hdg); PrintPoint (1.0, GS_Y - hdg, - hdg); PrintPoint (1.0, GS_Y - (4.0 * hdg), - (2.0 * hdg)); PrintPoint (1.0, GS_Y - (4.0 * hdg), (2.0 * hdg)); PrintPoint (1.0, GS_Y - hdg, hdg); PrintPath (vertx, nvert); WriteSegmentTables (stdout, "gs_pointer"); nvert = 0; PrintPoint (1.0, 0.0, VOR_DIR_BASE + VOR_DIR_HEIGHT); PrintPoint (1.0, VOR_DIR_WIDTH / 2.0, VOR_DIR_BASE); PrintPoint (1.0, -VOR_DIR_WIDTH / 2.0, VOR_DIR_BASE); PrintPoint (1.0, 0.0, VOR_DIR_BASE + VOR_DIR_HEIGHT); PrintPath (vertx, nvert); WriteSegmentTables (stdout, "vor_to_from"); exit (0); return 0; }