``````{
VINCE LAURENT

I wrote some code to draw a scalable hex field on the screen. Can
anyone give me a hand in optimizing it? There is a lot of redundant
line drawing and positioning... I would also like to be able to have
a fexible amount of hexigons showing.  For example, if the scale is,
say 40, show 19 hexs, if it is smaller, show more (like as many that
could have fit in the area occupied by 19).

BTW, this code can be freely used and distributed or completely ignored :-) }

Program HexzOnScreen;
Uses
Graph, Crt;
Type
PtArray = Array [1..6, 1..2] of Real;
Var
s1, s2,
side,
i, j,
Gd, Gm  : Integer;
Pts     : PtArray;
ErrCode : Integer;
Sqrt3,
sts     : Real;

begin
Sqrt3 := Sqrt(3);
Side  := 40;             { initial hex side length ( min = 8 ) }
sts   := Side * Sqrt3;
s1    := 200;
s2    := 60;     { starting point For hex field }
InitGraph(Gd, Gm, 'e:\bp\bgi\');
ErrCode := GraphResult;
if not ErrCode = grOk then
begin
Writeln('Error: ', GraphErrorMsg(ErrCode));
Halt(0);
end;
SetColor(LightGray);
Delay(10);   { give the screen a chance to toggle to Graph mode }
For j := 1 to 17 DO
begin
Pts[1, 1] := s1;
Pts[1, 2] := s2;
Pts[2, 1] := Pts[1, 1] - side;
Pts[2, 2] := Pts[1, 2];
Pts[3, 1] := Pts[1, 1] - side - (side / 2);
Pts[3, 2] := Pts[1, 2] + (sts / 2);
Pts[4, 1] := Pts[1, 1] - side;
Pts[4, 2] := Pts[1, 2] + sts ;
Pts[5, 1] := Pts[1, 1];
Pts[5, 2] := Pts[4, 2];
Pts[6, 1] := Pts[1, 1] + (side / 2);
Pts[6, 2] := Pts[1, 2] + (sts  / 2);
For I := 1 to 6 DO
begin
if i <> 6 then
Line(Round(Pts[i, 1]),  Round(Pts[i, 2]),
Round(Pts[i + 1, 1]), Round(Pts[i + 1, 2]))
else
Line(Round(Pts[i, 1]), Round(Pts[i, 2]),
Round(Pts[1, 1]), Round(Pts[1, 2]));
end;
Case j OF
1..2 :
begin
s1 := Round(Pts[6, 1] + side);
s2 := Round(Pts[6, 2]);
end;
3..4 :
begin
s1 := Round(Pts[5, 1]);
s2 := Round(Pts[5, 2]);
end;
5..6 :
begin
s1 := Round(Pts[3, 1]);
s2 := Round(Pts[3, 2]);
end;
7..8 :
begin
s1 := Round(Pts[3, 1]);
s2 := Round(Pts[3, 2] - sts);
end;
9..10 :
begin
s1 := Round(Pts[1, 1]);
s2 := Round(Pts[1, 2] - sts);
end;
11 :
begin
s1 := Round(Pts[6, 1] + side);
s2 := Round(Pts[6, 2] - sts);
end;
12..13 :
begin
s1 := Round(Pts[6, 1] + side);
s2 := Round(Pts[6, 2]);
end;
14 :
begin
s1 := Round(Pts[5, 1]);
s2 := Round(Pts[5, 2]);
end;
15 :
begin
s1 := Round(Pts[3, 1]);
s2 := Round(Pts[3, 2]);
end;
16 :
begin
s1 := Round(Pts[3, 1]);
s2 := Round(Pts[3, 2] - sts);
end;
end;
end;
Line(s1, s2, Round(s1 + (side / 2)), Round(s2 - sts / 2));
Readln;
CloseGraph;
end.

``````