## 13. Arrow

This draws an arrowed line. One can specify if the start and end points have an arrow.

<<funcdefs>>=
``````void btprnt_draw_arrow(btprnt_region *r,
int start_x, int start_y,
int end_x, int end_y,
int arrow_start,
int arrow_end,
int draw_line,
int c);``````

Arrowheads are equalateral triangles, angled relative to the slope of the line.

<<funcs>>=
``````void btprnt_draw_arrow(btprnt_region *r,
int start_x, int start_y,
int end_x, int end_y,
int arrow_start,
int arrow_end,
int draw_line,
int c)
{
int sz;
float angle;
float off;
int ptx[2];
int pty[2];
int dx;
int dy;
int dir;

if (start_x > end_x) {
dir = -1;
} else {
dir = 1;
}

sz = 9;

dx = end_x - start_x;
dy = end_y - start_y;

off = asin(dx / sqrt(dx*dx + dy*dy));

if (off < 0) {
dir *= -1;
}

angle = 30;
angle *= M_PI / 180.0;

if (draw_line) {
btprnt_draw_line(r,
start_x, start_y,
end_x, end_y, c);
}

if (arrow_start) {
ptx[0] = start_x + dir * sz * sin(angle + off);
pty[0] = start_y + dir * sz * cos(angle + off);

ptx[1] = start_x + dir * sz * sin(off - angle);
pty[1] = start_y + dir * sz * cos(off - angle);

btprnt_draw_triangle(r,
start_x, start_y,
ptx[0], pty[0],
ptx[1], pty[1],
c);
}

if (arrow_end) {
ptx[0] = end_x + -dir * sz * sin(angle + off);
pty[0] = end_y + -dir * sz * cos(angle + off);

ptx[1] = end_x + -dir * sz * sin(off - angle);
pty[1] = end_y + -dir * sz * cos(off - angle);

btprnt_draw_triangle(r,
end_x, end_y,
ptx[0], pty[0],
ptx[1], pty[1],
c);

}
}``````

prev | home | next