/* * arrow.c --- 有向線分の描画 */ #include <stdio.h> #include <math.h> #define G_DOUBLE #include <glsc.h> /* ------------------------------------------------------------- */ /* π, 度とラジアンの換算用の比 */ double arrow_pi, arrow_degree; int arrow_initialized = 0; void init_arrow() { arrow_initialized = 1; arrow_pi = 4 * atan(1.0); arrow_degree = arrow_pi / 180.0; } /* 有向線分(矢印のある線分)を描く */ void arrow(double p1, double p2, double q1, double q2, double lambda) { double e1, e2, norm; double fl1, fl2, fu1, fu2, theta, cost, sint; double qu1, qu2, ql1, ql2, r1, r2, t; double phi; double vx[5], vy[5]; int fill; if (!arrow_initialized) init_arrow(); /* */ theta = 15.0 * arrow_degree; phi = 30.0 * arrow_degree; /* e=(p-q)/||p-q|| */ e1 = p1 - q1; e2 = p2 - q2; norm = hypot(e1, e2); e1 /= norm; e2 /= norm; /* fl = λ R(θ) e */ cost = cos(theta); sint = sin(theta); fl1 = lambda * (cost * e1 - sint * e2); fl2 = lambda * (sint * e1 + cost * e2); /* fu = λ R(-θ) e */ fu1 = lambda * ( cost * e1 + sint * e2); fu2 = lambda * (- sint * e1 + cost * e2); /* ql = q + fl */ ql1 = q1 + fl1; ql2 = q2 + fl2; /* qu = q + fu */ qu1 = q1 + fu1; qu2 = q2 + fu2; /* r = q + λ cosθ(1-tanθ/tanφ)e */ t = lambda * cost * (1 - tan(theta) / tan(phi)); r1 = q1 + t * e1; r2 = q2 + t * e2; /* */ vx[0] = q1; vy[0] = q2; vx[1] = qu1; vy[1] = qu2; vx[2] = r1; vy[2] = r2; vx[3] = ql1; vy[3] = ql2; vx[4] = q1; vy[4] = q2; g_sel_area(0); fill = G_YES; /* */ g_move(p1, p2); g_plot(r1, r2); g_polygon(vx, vy, 5, G_NO, fill); } /* ------------------------------------------------------------- */ int main() { g_init("META", 220.0, 220.0); g_device(G_BOTH); g_def_scale(0, -1.0, 5.0, -1.0, 5.0, 10.0, 10.0, 200.0, 200.0); g_sel_scale(0); /* arrow のために必要 */ g_def_area(0, G_BLACK); g_def_line(0, G_BLACK, 3, G_LINE_SOLID); g_sel_line(0); arrow(1.0, 1.0, 4.0, 1.0, 0.8); g_sleep(-1.0); g_term(); return 0; }
桂田 祐史