void DrawArrowHead(Point to, VelocityRec velocity) { double angle; Rect r; MySetRect(&r, to.h - ARROWSIZE, to.v - ARROWSIZE, to.h + ARROWSIZE, to.v + ARROWSIZE); angle = atan2(-velocity.v, velocity.u); PaintArc(&r, (angle * 180) / PI - (20 + 90), 40); }
static void draw_marker(double xn, double yn, int mtype, double mscale, int mcolor) { int r, x, y, i; double scale, xr, yr; int pc, op; PolyHandle poly; Rect rect; static int marker[26][57] = { { 5, 9, -4, 7, 4, 7, 7, 4, 7, -4, /* omark */ 4, -7, -4, -7, -7, -4, -7, 4, -4, 7, 3, 9, -4, 7, 4, 7, 7, 4, 7, -4, 4, -7, -4, -7, -7, -4, -7, 4, -4, 7, 0 }, { 5, 13, -2, 8, 2, 8, 2, 2, 8, 2, /* hollow plus */ 8, -2, 2, -2, 2, -8, -2, -8, -2, -2, -8, -2, -8, 2, -2, 2, -2, 8, 3, 13, -2, 8, 2, 8, 2, 2, 8, 2, 8, -2, 2, -2, 2, -8, -2, -8, -2, -2, -8, -2, -8, 2, -2, 2, -2, 8, 0 }, { 4, 4, -8, 0, 4, 7, 4, -7, /* solid triangle right */ -8, 0, 0 }, { 4, 4, 8, 0, -4, -7, -4, 7, /* solid triangle left */ 8, 0, 0 }, { 5, 4, 0, 8, 7, -4, -7, -4, 0, 8, /* triangle up down */ 5, 4, 0, -8, -7, 4, 7, 4, 0, -8, 3, 4, 0, 8, 7, -4, -7, -4, 0, 8, 3, 4, 0, -8, -7, 4, 7, 4, 0, -8, 0 }, { 4, 11, 0, 9, 2, 2, 9, 3, 3, -1, /* solid star */ 6, -8, 0, -3, -6, -8, -3, -1, -9, 3, -2, 2, 0, 9, 0 }, { 5, 11, 0, 9, 2, 2, 9, 3, 3, -1, /* hollow star */ 6, -8, 0, -3, -6, -8, -3, -1, -9, 3, -2, 2, 0, 9, 3, 11, 0, 9, 2, 2, 9, 3, 3, -1, 6, -8, 0, -3, -6, -8, -3, -1, -9, 3, -2, 2, 0, 9, 0 }, { 4, 5, 0, 9, 9, 0, 0, -9, -9, 0, /* solid diamond */ 0, 9, 0 }, { 5, 5, 0, 9, 9, 0, 0, -9, -9, 0, /* hollow diamond */ 0, 9, 3, 5, 0, 9, 9, 0, 0, -9, -9, 0, 0, 9, 0 }, { 4, 5, 9, 9, -9, -9, 9, -9, -9, 9, /* solid hourglass */ 9, 9, 0 }, { 5, 5, 9, 9, -9, -9, 9, -9, -9, 9, /* hollow hourglass */ 9, 9, 3, 5, 9, 9, -9, -9, 9, -9, -9, 9, 9, 9, 0 }, { 4, 5, 9, 9, 9, -9, -9, 9, -9, -9, /* solid bowtie */ 9, 9, 0 }, { 5, 5, 9, 9, 9, -9, -9, 9, -9, -9, /* hollow bowtie */ 9, 9, 3, 5, 9, 9, 9, -9, -9, 9, -9, -9, 9, 9, 0 }, { 4, 5, 9, 9, 9, -9, -9, -9, -9, 9, /* solid square */ 9, 9, 0 }, { 5, 5, 9, 9, 9, -9, -9, -9, -9, 9, /* hollow square */ 9, 9, 3, 5, 9, 9, 9, -9, -9, -9, -9, 9, 9, 9, 0 }, { 4, 4, -9, 9, 9, 9, 0, -9, -9, 9, /* solid triangle down */ 0 }, { 5, 4, -9, 9, 9, 9, 0, -9, -9, 9, /* hollow triangle down */ 3, 4, -9, 9, 9, 9, 0, -9, -9, 9, 0 }, { 4, 4, 0, 9, 9, -9, -9, -9, 0, 9, /* solid triangle up */ 0 }, { 5, 4, 0, 9, 9, -9, -9, -9, 0, 9, /* hollow triangle up */ 3, 4, 0, 9, 9, -9, -9, -9, 0, 9, 0 }, { 7, 0 }, /* solid circle */ { 0 }, /* not used */ { 1, 0 }, /* dot */ { 2, 0, 0, 0, 9, 2, 0, 0, 9, 0, /* plus */ 2, 0, 0, 0, -9, 2, 0, 0, -9, 0, 0 }, { 2, 0, 0, 0, 9, 2, 0, 0, 9, 3, /* asterisk */ 2, 0, 0, 6, -9, 2, 0, 0, -6, -9, 2, 0, 0, -9, 3, 0 }, { 8, 6, 0 }, /* circle */ { 2, 0, 0, 9, 9, 2, 0, 0, 9, -9, /* diagonal cross */ 2, 0, 0, -9, -9, 2, 0, 0, -9, 9, 0 } }; if (gkss->version > 4) mscale *= p->height / 500.0; r = (int)(3 * mscale); scale = mscale / 3.0; xr = r; yr = 0; seg_xform_rel(&xr, &yr); r = nint(sqrt(xr * xr + yr * yr)); NDC_to_DC(xn, yn, x, y); pc = 0; mtype = (r > 0) ? mtype + 20 : 21; do { op = marker[mtype][pc]; switch (op) { case 1: /* point */ MoveTo(x, y); LineTo(x, y); break; case 2: /* line */ for (i = 0; i < 2; i++) { xr = scale * marker[mtype][pc + 2 * i + 1]; yr = -scale * marker[mtype][pc + 2 * i + 2]; seg_xform_rel(&xr, &yr); if (i == 0) MoveTo(x - xr, y + yr); else LineTo(x - xr, y + yr); } pc += 4; break; case 3: /* polyline */ for (i = 0; i < marker[mtype][pc + 1]; i++) { xr = scale * marker[mtype][pc + 2 + 2 * i]; yr = -scale * marker[mtype][pc + 3 + 2 * i]; seg_xform_rel(&xr, &yr); if (i == 0) MoveTo(x - xr, y + yr); else LineTo(x - xr, y + yr); } pc += 1 + 2 * marker[mtype][pc + 1]; break; case 4: /* filled polygon */ case 5: /* hollow polygon */ poly = OpenPoly(); if (op == 5) set_color(0); for (i = 0; i < marker[mtype][pc + 1]; i++) { xr = scale * marker[mtype][pc + 2 + 2 * i]; yr = -scale * marker[mtype][pc + 3 + 2 * i]; seg_xform_rel(&xr, &yr); if (i == 0) MoveTo(x - xr, y + yr); else LineTo(x - xr, y + yr); } ClosePoly(); PaintPoly(poly); KillPoly(poly); pc += 1 + 2 * marker[mtype][pc + 1]; if (op == 5) set_color(mcolor); break; case 6: /* arc */ rect.top = y - r; rect.left = x - r; rect.bottom = y + r; rect.right = x + r; FrameArc(&rect, 0, 360); break; case 7: /* filled arc */ case 8: /* hollow arc */ if (op == 8) set_color(0); rect.top = y - r; rect.left = x - r; rect.bottom = y + r; rect.right = x + r; PaintArc(&rect, 0, 360); if (op == 8) set_color(mcolor); break; } pc++; } while (op != 0); }