{ Gann Box Drawing Tool written by Lawrence Chan copyright (c) 2005 by TickQuest Inc. Jun 20, 2005 } function toolname : string; begin result := 'GannBox'; end; function numpoints : integer; begin result := 2; end; procedure add_next_line (c, x1, y1, x2, y2 : integer; var list : variant; var i : integer); begin list [i] := c; list [i + 1] := x1; list [i + 2] := y1; list [i + 3] := x2; list [i + 4] := y2; i := i + 5; end; procedure draw2 ( boundary, xlist, ylist, prices, hlist, vlist, flist, clist; var command_list : variant); var i, j, x1, x2, x3, x4, y1, y2, y3, y4, lb, ub, hsize : integer; delta, udelta, xdelta, arraysize : integer; bound_left, bound_top, bound_right, bound_bottom : integer; v, udelta2 : double; draw_hmult : boolean; begin // 2 control points are enough x1 := xlist [0]; x2 := xlist [1]; y1 := ylist [0]; y2 := ylist [1]; // grab the boundary points bound_left := boundary [0]; bound_top := boundary [1]; bound_right := boundary [2]; bound_bottom := boundary [3]; // initialize the resulting commands for a single line arraysize := 5; RedimVarArray (command_list, arraysize); // i := 0; // diagonal lines drawn from top to bottom delta := y2 - y1; udelta := delta; if delta < 0 then udelta := - delta; if delta = 0 then add_next_line (5, x1, y1, x2, y2, command_list, i) else begin y3 := y1 - int ((y1 - bound_top) / udelta) * udelta; xdelta := x2 - x1; if xdelta < 0 then xdelta := - xdelta; if xdelta <> 0 then y3 := y3 - int ((bound_right - bound_left) / xdelta) * udelta; y4 := y3 + udelta; x3 := x1; x4 := x2; while y3 < bound_bottom do begin add_next_line (5, x3, y3, x4, y4, command_list, i); y3 := y3 + udelta; y4 := y4 + udelta; arraysize := arraysize + 5; RedimVarArray (command_list, arraysize); end; end; // diagonal lines drawn from bottom to top if delta = 0 then add_next_line (5, x1, y2, x2, y1, command_list, i) else begin y3 := y1 - int ((y1 - bound_bottom) / udelta) * udelta; if xdelta <> 0 then y3 := y3 + int ((bound_right - bound_left) / xdelta) * udelta; y4 := y3 - udelta; x3 := x1; x4 := x2; while y3 > bound_top do begin add_next_line (5, x3, y3, x4, y4, command_list, i); y3 := y3 - udelta; y4 := y4 - udelta; arraysize := arraysize + 5; RedimVarArray (command_list, arraysize); end; end; // horizontal lines drawn from top to bottom if delta <> 0 then begin udelta2 := udelta / 2; y3 := round (y1 - int ((y1 - bound_top) / udelta2) * udelta2); j := 0; y4 := y3; x3 := x1; x4 := x2; while y4 < bound_bottom do begin add_next_line (5, x3, y4, x4, y4, command_list, i); inc (j); y4 := round (y3 + j * udelta2); arraysize := arraysize + 5; RedimVarArray (command_list, arraysize); end; end; // first vertical line add_next_line (6, x1, y1, x1, y2, command_list, i); // clean up RedimVarArray (command_list, i); end;