home *** CD-ROM | disk | FTP | other *** search
- PROGRAM hpmaze;
- {
- This program will generate a three dimensional maze suitable for
- printing on a Hewlett-Packard LaserJet IID printer. A different
- random number seed will produce a different maze.
-
- Written by James L. Dean
- 406 40th Street
- New Orleans, LA 70124
- }
- USES Crt;
-
- CONST
- { printer constants }
- DOTS_PER_INCH = 300;
- WIDTH_IN_INCHES = 8.5;
- LENGTH_IN_INCHES = 11.0;
- DOTS_PER_STROKE = 1; { 300 DIV DOTS_PER_INCH }
- NUM_Y_DOTS = 2550; { trunc(WIDTH_IN_INCHES*DOTS_PER_INCH) }
- Y_DOT_MAX = 2549; { NUM_Y_DOTS-1 }
- NUM_X_BYTES = 412; { trunc(LENGTH_IN_INCHES*DOTS_PER_INCH/8.0) }
- X_BYTE_MAX = 411; { NUM_X_BYTES-1 }
- NUM_X_DOTS = 3296; { 8*NUM_X_BYTES }
- X_DOT_MAX = 3295; { NUM_X_DOTS-1 }
- NUM_SLICES = 4; { smaller values run faster, use more memory }
- ROWS_PER_SLICE = 638; { (NUM_Y_DOTS+NUM_SLICES-1) DIV NUM_SLICES }
-
- { maze constants }
- MIN_DOTS_PER_ROOM_WALL = 40;
- NUM_COLUMNS = 32; { <= NUM_X_DOTS DIV MIN_DOTS_PER_ROOM_WALL }
- MAX_X = 64; { 2*NUM_COLUMNS }
- NUM_ROWS = 24; { <= NUM_Y_DOTS DIV MIN_DOTS_PER_ROOM_WALL }
- MAX_Y = 48; { 2*NUM_ROWS }
- { float(NUM_COLUMNS)/float(NUM_ROWS) should be approximately
- LENGTH_IN_INCHES/WIDTH_IN_INCHES }
- { memory requirements and run time increase with NUM_COLUMNS*NUM_ROWS }
- { HPMAZE.TMP requires 104*(2*NUM_COLUMNS+3)*(2*NUM_ROWS+3) bytes of
- space }
-
- { escape sequences }
- cursor_x_prefix : ARRAY [1..3] OF CHAR = (#27,'*','p');
- cursor_x_suffix : CHAR = 'X';
- cursor_y_prefix : ARRAY [1..3] OF CHAR = (#27,'*','p');
- cursor_y_suffix : CHAR = 'Y';
- dpi_prefix : ARRAY [1..3] OF CHAR = (#27,'*','t');
- dpi_suffix : CHAR = 'R';
- landscape : ARRAY [1..5] OF CHAR = (#27,'&','l','1','O');
- logical_mode : ARRAY [1..5] OF CHAR = (#27,'*','r','0','F');
- raster_prefix : ARRAY [1..5] OF CHAR = (#27,'*','r','1','A');
- raster_suffix : ARRAY [1..4] OF CHAR = (#27,'*','r','B');
- row_prefix : ARRAY [1..3] OF CHAR = (#27,'*','b');
- row_suffix : CHAR = 'W';
-
- TYPE
- PointType = RECORD
- x : INTEGER;
- y : INTEGER
- END;
- prime_record = RECORD
- x : REAL;
- y : REAL;
- z : REAL;
- lesser_x : LONGINT;
- greater_x : LONGINT
- END;
- row_type = RECORD
- column : ARRAY [0..X_BYTE_MAX] OF BYTE
- END;
- row_ptr_type = ^row_type;
-
- VAR
- ascii_equivalent : STRING[5];
- column_num : INTEGER;
- cursor_x : INTEGER;
- cursor_y : INTEGER;
- delta_index_1 : INTEGER;
- delta_index_1a : INTEGER;
- delta_index_1b : INTEGER;
- delta_index_1c : INTEGER;
- delta_index_1d : INTEGER;
- delta_index_2 : INTEGER;
- delta_x : ARRAY [1..4,1..24] OF INTEGER;
- delta_y : ARRAY [1..4,1..24] OF INTEGER;
- digit : INTEGER;
- digit_num : INTEGER;
- ending_column_num : INTEGER;
- max_y_out : INTEGER;
- max_z_out : INTEGER;
- maze : FILE;
- non_null_found : BOOLEAN;
- num_bytes : INTEGER;
- num_x_divisions : INTEGER;
- num_y_divisions : INTEGER;
- page : ARRAY [0..MAX_Y,0..MAX_X] OF CHAR;
- prime : FILE;
- prime_head : LONGINT;
- prime_tail : LONGINT;
- r_n : ARRAY [1..8] OF INTEGER;
- r_n_index_1 : INTEGER;
- r_n_index_2 : INTEGER;
- row_ptr : ARRAY [1..ROWS_PER_SLICE] OF row_ptr_type;
- rotation : REAL;
- row_num : INTEGER;
- seed : STRING[8];
- slice_y : INTEGER;
- slice_y_start : INTEGER;
- slice_y_stop : INTEGER;
- starting_column_num : INTEGER;
- sum : INTEGER;
- tem_int : INTEGER;
- tilt : REAL;
- x : INTEGER;
- x_max : REAL;
- x_min : REAL;
- x_next : INTEGER;
- x_out : INTEGER;
- x_prime_max : REAL;
- x_wall_1 : INTEGER;
- y : INTEGER;
- y_max : REAL;
- y_min : REAL;
- y_next : INTEGER;
- y_out : INTEGER;
- y_prime_max : REAL;
- y_prime_min : REAL;
- y_wall_1 : INTEGER;
- z_prime_max : REAL;
- z_prime_min : REAL;
-
- PROCEDURE add_room;
- VAR
- delta_index_1 : BYTE;
- delta_index_2 : BYTE;
- BEGIN
- page[y,x]:=' ';
- delta_index_1:=1;
- REPEAT
- delta_index_2:=r_n[1];
- r_n_index_1:=1;
- FOR r_n_index_2:=2 TO 8 DO
- BEGIN
- tem_int:=r_n[r_n_index_2];
- r_n[r_n_index_1]:=tem_int;
- delta_index_2:=delta_index_2+tem_int;
- IF delta_index_2 > 29 THEN
- delta_index_2:=delta_index_2-29;
- r_n_index_1:=r_n_index_2
- END;
- r_n[8]:=delta_index_2
- UNTIL
- (delta_index_2 <= 24);
- WHILE (delta_index_1 <= 4) DO
- BEGIN
- x_next:=x+2*delta_x[delta_index_1][delta_index_2];
- IF ((x_next <= 0) OR (x_next >= MAX_X)) THEN
- delta_index_1:=delta_index_1+1
- ELSE
- BEGIN
- y_next:=y+2*delta_y[delta_index_1][delta_index_2];
- IF ((y_next <= 0) OR (y_next >= MAX_Y)) THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF page[y_next,x_next] = 'W' THEN
- BEGIN
- IF x = x_next THEN
- BEGIN
- y_wall_1:=(y+y_next) DIV 2;
- page[y_wall_1,x_next]:=' '
- END
- ELSE
- BEGIN
- x_wall_1:=(x+x_next) DIV 2;
- page[y_next,x_wall_1]:=' '
- END;
- x:=x_next;
- y:=y_next;
- add_room;
- x:=x-2*delta_x[delta_index_1][delta_index_2];
- y:=y-2*delta_y[delta_index_1][delta_index_2]
- END
- ELSE
- delta_index_1:=delta_index_1+1
- END
- END
- END;
- FUNCTION f(x,y : REAL) : REAL;
- VAR
- x_out : INTEGER;
- y_out : INTEGER;
- BEGIN
- y_out:=TRUNC(x/2.0)-1;
- IF y_out < 0 THEN
- f:=0.0
- ELSE
- IF y_out > MAX_Y THEN
- f:=0.0
- ELSE
- BEGIN
- x_out:=TRUNC(y/2.0)-1;
- IF x_out < 0 THEN
- f:=0.0
- ELSE
- IF x_out > MAX_X THEN
- f:=0.0
- ELSE
- IF page[y_out,x_out] = 'W' THEN
- f:=3.4
- ELSE
- f:=0.0
- END
- END;
- PROCEDURE evaluate_and_transform(
- VAR x_min : REAL;
- VAR x_max : REAL;
- VAR y_min : REAL;
- VAR y_max : REAL;
- VAR num_x_divisions : INTEGER;
- VAR num_y_divisions : INTEGER;
- VAR rotation : REAL;
- VAR tilt : REAL;
- VAR x_prime_max : REAL;
- VAR y_prime_min : REAL;
- VAR y_prime_max : REAL;
- VAR z_prime_min : REAL;
- VAR z_prime_max : REAL);
- VAR
- cos_rotation : REAL;
- cos_tilt : REAL;
- delta_x : REAL;
- delta_y : REAL;
- radians : REAL;
- radians_per_degree : REAL;
- sin_rotation : REAL;
- sin_tilt : REAL;
- x : REAL;
- x_division_num : INTEGER;
- x_prime : REAL;
- x_rotated : REAL;
- y : REAL;
- y_division_num : INTEGER;
- y_prime : REAL;
- z : REAL;
- z_prime : REAL;
- BEGIN
- radians_per_degree:=arctan(1.0)/45.0;
- radians:=tilt*radians_per_degree;
- cos_tilt:=COS(radians);
- sin_tilt:=SIN(radians);
- radians:=rotation*radians_per_degree;
- cos_rotation:=COS(radians);
- sin_rotation:=SIN(radians);
- z:=f(x_min,y_min);
- x_rotated:=x_min*cos_rotation+y_min*sin_rotation;
- y_prime_min:=-x_min*sin_rotation+y_min*cos_rotation;
- z_prime_min:=-x_rotated*sin_tilt+z*cos_tilt;
- x_prime_max:=x_rotated*cos_tilt+z*sin_tilt;
- y_prime_max:=y_prime_min;
- z_prime_max:=z_prime_min;
- delta_x:=num_x_divisions;
- delta_x:=(x_max-x_min)/delta_x;
- delta_y:=num_y_divisions;
- delta_y:=(y_max-y_min)/delta_y;
- x:=x_min;
- FOR x_division_num:=1 TO num_x_divisions DO
- BEGIN
- y:=y_min;
- FOR y_division_num:=1 TO num_y_divisions DO
- BEGIN
- z:=f(x,y);
- x_rotated:=x*cos_rotation+y*sin_rotation;
- y_prime:=-x*sin_rotation+y*cos_rotation;
- x_prime:=x_rotated*cos_tilt+z*sin_tilt;
- z_prime:=-x_rotated*sin_tilt+z*cos_tilt;
- IF x_prime > x_prime_max THEN
- x_prime_max:=x_prime;
- IF y_prime < y_prime_min THEN
- y_prime_min:=y_prime;
- IF y_prime > y_prime_max THEN
- y_prime_max:=y_prime;
- IF z_prime < z_prime_min THEN
- z_prime_min:=z_prime;
- IF z_prime > z_prime_max THEN
- z_prime_max:=z_prime;
- y:=y+delta_y
- END;
- x:=x+delta_x
- END
- END;
- PROCEDURE adjust_perspective(
- VAR x_min : REAL;
- VAR x_max : REAL;
- VAR y_min : REAL;
- VAR y_max : REAL;
- VAR num_x_divisions : INTEGER;
- VAR num_y_divisions : INTEGER;
- VAR rotation : REAL;
- VAR tilt : REAL;
- VAR prime_head : LONGINT;
- VAR prime_tail : LONGINT;
- VAR x_prime_max : REAL;
- VAR y_prime_min : REAL;
- VAR y_prime_max : REAL;
- VAR z_prime_min : REAL;
- VAR z_prime_max : REAL);
- VAR
- cos_rotation : REAL;
- cos_tilt : REAL;
- delta_x : REAL;
- delta_y : REAL;
- delta_z : REAL;
- finished : BOOLEAN;
- last_prime_ptr : LONGINT;
- last_prime_rec : prime_record;
- prime_ptr : LONGINT;
- prime_rec : prime_record;
- radians : REAL;
- radians_per_degree : REAL;
- sin_rotation : REAL;
- sin_tilt : REAL;
- temp_rec : prime_record;
- x : REAL;
- x_division_num : INTEGER;
- x_eye : REAL;
- x_increment : REAL;
- x_prime : REAL;
- x_rotated : REAL;
- y : REAL;
- y_center : REAL;
- y_division_num : INTEGER;
- y_increment : REAL;
- y_prime : REAL;
- z : REAL;
- z_center : REAL;
- z_prime : REAL;
- BEGIN
- IF (y_prime_max-y_prime_min) > (z_prime_max-z_prime_min) THEN
- x_eye:=2.0*(y_prime_max-y_prime_min)+x_prime_max
- ELSE
- x_eye:=2.0*(z_prime_max-z_prime_min)+x_prime_max;
- IF x_eye <> x_prime_max THEN
- BEGIN
- radians_per_degree:=arctan(1.0)/45.0;
- radians:=tilt*radians_per_degree;
- cos_tilt:=COS(radians);
- sin_tilt:=SIN(radians);
- radians:=rotation*radians_per_degree;
- cos_rotation:=COS(radians);
- sin_rotation:=SIN(radians);
- x_increment:=num_x_divisions;
- x_increment:=(x_max-x_min)/x_increment;
- y_increment:=num_y_divisions;
- y_increment:=(y_max-y_min)/y_increment;
- y_center:=(y_prime_max+y_prime_min)/2.0;
- z_center:=(z_prime_max+z_prime_min)/2.0;
- last_prime_ptr:=-1;
- prime_head:=-1;
- prime_tail:=-1;
- prime_ptr:=-1;
- x:=x_min;
- FOR x_division_num:=1 TO num_x_divisions DO
- BEGIN
- y:=y_min;
- FOR y_division_num:=1 TO num_y_divisions DO
- BEGIN
- prime_ptr:=prime_ptr+1;
- z:=f(x,y);
- x_rotated:=x*cos_rotation+y*sin_rotation;
- y_prime:=-x*sin_rotation+y*cos_rotation;
- x_prime:=x_rotated*cos_tilt+z*sin_tilt;
- z_prime:=-x_rotated*sin_tilt+z*cos_tilt;
- delta_x:=x_prime-x_eye;
- delta_y:=y_prime-y_center;
- delta_z:=z_prime-z_center;
- prime_rec.x
- :=SQRT(delta_x*delta_x+delta_y*delta_y+delta_z*delta_z);
- prime_rec.y:=y_center
- +(y_prime-y_center)*(x_eye-x_prime_max)/(x_eye-x_prime);
- prime_rec.z:=z_center
- +(z_prime-z_center)*(x_eye-x_prime_max)/(x_eye-x_prime);
- IF last_prime_ptr = -1 THEN
- BEGIN
- prime_head:=prime_ptr;
- prime_tail:=prime_ptr;
- prime_rec.lesser_x:=-1;
- prime_rec.greater_x:=-1
- END
- ELSE
- IF prime_rec.x < last_prime_rec.x THEN
- BEGIN
- finished:=FALSE;
- WHILE (NOT finished) DO
- BEGIN
- last_prime_ptr:=last_prime_rec.lesser_x;
- IF last_prime_ptr = -1 THEN
- finished:=TRUE
- ELSE
- BEGIN
- Seek(prime,last_prime_ptr);
- BlockRead(prime,last_prime_rec,1);
- IF prime_rec.x >= last_prime_rec.x THEN
- finished:=TRUE
- END
- END;
- prime_rec.lesser_x:=last_prime_ptr;
- IF last_prime_ptr = -1 THEN
- BEGIN
- Seek(prime,prime_head);
- BlockRead(prime,temp_rec,1);
- temp_rec.lesser_x:=prime_ptr;
- Seek(prime,prime_head);
- BlockWrite(prime,temp_rec,1);
- prime_rec.greater_x:=prime_head;
- prime_head:=prime_ptr
- END
- ELSE
- BEGIN
- prime_rec.greater_x:=last_prime_rec.greater_x;
- Seek(prime,last_prime_rec.greater_x);
- BlockRead(prime,temp_rec,1);
- temp_rec.lesser_x:=prime_ptr;
- Seek(prime,last_prime_rec.greater_x);
- BlockWrite(prime,temp_rec,1);
- last_prime_rec.greater_x:=prime_ptr;
- Seek(prime,last_prime_ptr);
- BlockWrite(prime,last_prime_rec,1)
- END
- END
- ELSE
- BEGIN
- finished:=FALSE;
- WHILE (NOT finished) DO
- BEGIN
- last_prime_ptr:=last_prime_rec.greater_x;
- IF last_prime_ptr = -1 THEN
- finished:=TRUE
- ELSE
- BEGIN
- Seek(prime,last_prime_ptr);
- BlockRead(prime,last_prime_rec,1);
- IF prime_rec.x <= last_prime_rec.x THEN
- finished:=TRUE
- END
- END;
- prime_rec.greater_x:=last_prime_ptr;
- IF last_prime_ptr = -1 THEN
- BEGIN
- Seek(prime,prime_tail);
- BlockRead(prime,temp_rec,1);
- temp_rec.greater_x:=prime_ptr;
- Seek(prime,prime_tail);
- BlockWrite(prime,temp_rec,1);
- prime_rec.lesser_x:=prime_tail;
- prime_tail:=prime_ptr
- END
- ELSE
- BEGIN
- prime_rec.lesser_x:=last_prime_rec.lesser_x;
- Seek(prime,last_prime_rec.lesser_x);
- BlockRead(prime,temp_rec,1);
- temp_rec.greater_x:=prime_ptr;
- Seek(prime,last_prime_rec.lesser_x);
- BlockWrite(prime,temp_rec,1);
- last_prime_rec.lesser_x:=prime_ptr;
- Seek(prime,last_prime_ptr);
- BlockWrite(prime,last_prime_rec,1)
- END
- END;
- Seek(prime,prime_ptr);
- BlockWrite(prime,prime_rec,1);
- y:=y+y_increment;
- last_prime_ptr:=prime_ptr;
- last_prime_rec.x:=prime_rec.x;
- last_prime_rec.y:=prime_rec.y;
- last_prime_rec.z:=prime_rec.z;
- last_prime_rec.lesser_x:=prime_rec.lesser_x;
- last_prime_rec.greater_x:=prime_rec.greater_x
- END;
- x:=x+x_increment
- END
- END
- END;
- PROCEDURE pset(
- VAR x : INTEGER;
- VAR y : INTEGER;
- edge : BOOLEAN);
- CONST
- black : ARRAY [0..7] OF BYTE
- = (128,64,32,16,8,4,2,1);
- white : ARRAY [0..7] OF BYTE
- = (127,191,223,239,247,251,253,254);
- VAR
- bit_num : INTEGER;
- byte_num : INTEGER;
- slice_y : INTEGER;
- BEGIN
- IF y >= slice_y_start THEN
- BEGIN
- IF y <= slice_y_stop THEN
- BEGIN
- slice_y:=y-slice_y_start+1;
- byte_num:=x DIV 8;
- bit_num:=x-8*byte_num;
- IF edge THEN
- row_ptr[slice_y]^.column[byte_num]
- :=row_ptr[slice_y]^.column[byte_num] OR black[bit_num]
- ELSE
- row_ptr[slice_y]^.column[byte_num]
- :=row_ptr[slice_y]^.column[byte_num] AND white[bit_num]
- END
- END
- END;
- PROCEDURE draw_line(
- VAR x1 : INTEGER;
- VAR y1 : INTEGER;
- VAR x2 : INTEGER;
- VAR y2 : INTEGER);
- VAR
- error : INTEGER;
- error_prime_x : INTEGER;
- error_prime_y : INTEGER;
- permissible_delta_x : INTEGER;
- permissible_delta_y : INTEGER;
- x : INTEGER;
- x_diff : INTEGER;
- y : INTEGER;
- y_diff : INTEGER;
- BEGIN
- IF x2 >= x1 THEN
- permissible_delta_x:=1
- ELSE
- permissible_delta_x:=-1;
- IF y2 >= y1 THEN
- permissible_delta_y:=1
- ELSE
- permissible_delta_y:=-1;
- x:=x1;
- y:=y1;
- x_diff:=x2-x1;
- y_diff:=y2-y1;
- error:=0;
- pset(x,y,TRUE);
- WHILE ((x <> x2) OR (y <> y2)) DO
- BEGIN
- error_prime_x:=error+permissible_delta_x*y_diff;
- error_prime_y:=error-permissible_delta_y*x_diff;
- IF ABS(error_prime_x) <= ABS(error_prime_y) THEN
- BEGIN
- x:=x+permissible_delta_x;
- error:=error_prime_x
- END
- ELSE
- BEGIN
- y:=y+permissible_delta_y;
- error:=error_prime_y
- END;
- pset(x,y,TRUE)
- END
- END;
- PROCEDURE plot(
- VAR prime_tail : LONGINT;
- VAR y_prime_min : REAL;
- VAR y_prime_max : REAL;
- VAR z_prime_min : REAL;
- VAR z_prime_max : REAL;
- VAR max_y_out : INTEGER;
- VAR max_z_out : INTEGER;
- VAR num_x_divisions : INTEGER;
- VAR num_y_divisions : INTEGER);
- VAR
- box : ARRAY [1..4] OF PointType;
- box_delta_x : LONGINT;
- box_delta_y : LONGINT;
- box_num_1 : INTEGER;
- box_num_2 : INTEGER;
- box_x_intercept : LONGINT;
- box_x1 : INTEGER;
- box_x2 : INTEGER;
- box_y_max : INTEGER;
- box_y_min : INTEGER;
- box_y_offset : LONGINT;
- box_y1 : INTEGER;
- down_ptr : LONGINT;
- intercept_count_mod_2 : INTEGER;
- heap_size : LONGINT;
- line_x1 : INTEGER;
- line_x2 : INTEGER;
- line_y1 : INTEGER;
- line_y2 : INTEGER;
- pixels_per_unit : REAL;
- prime_ptr : LONGINT;
- prime_rec : prime_record;
- right_ptr : LONGINT;
- temp_rec : prime_record;
- y_offset : REAL;
- y_out_max : REAL;
- z_offset : REAL;
- z_out_max : REAL;
- BEGIN
- y_out_max:=max_y_out;
- z_out_max:=max_z_out;
- IF z_out_max*(y_prime_max-y_prime_min)
- > y_out_max*(z_prime_max-z_prime_min) THEN
- BEGIN
- pixels_per_unit
- :=y_out_max/(y_prime_max-y_prime_min);
- y_offset:=0.0;
- z_offset
- :=-(z_out_max-pixels_per_unit*(z_prime_max-z_prime_min))/2.0
- END
- ELSE
- IF z_out_max*(y_prime_max-y_prime_min)
- < y_out_max*(z_prime_max-z_prime_min) THEN
- BEGIN
- pixels_per_unit:=z_out_max/(z_prime_max-z_prime_min);
- y_offset:=(y_out_max
- -pixels_per_unit*(y_prime_max-y_prime_min))
- /2.0;
- z_offset:=0.0
- END
- ELSE { plot degenerates to a single point }
- BEGIN
- pixels_per_unit:=1.0;
- y_offset:=y_out_max/2.0;
- z_offset:=-z_out_max/2.0
- END;
- prime_ptr:=prime_tail;
- heap_size:=num_x_divisions;
- heap_size:=heap_size*num_y_divisions;
- WHILE (prime_ptr <> -1) DO
- BEGIN
- Seek(prime,prime_ptr);
- BlockRead(prime,prime_rec,1);
- right_ptr:=prime_ptr+1;
- IF ((right_ptr MOD num_y_divisions) <> 0) THEN
- BEGIN
- down_ptr:=prime_ptr+num_y_divisions;
- IF (down_ptr < heap_size) THEN
- BEGIN
- box[1].x:=TRUNC(y_offset+pixels_per_unit
- *(prime_rec.y-y_prime_min));
- box[1].y:=TRUNC(z_offset+z_out_max
- -pixels_per_unit*(prime_rec.z-z_prime_min));
- Seek(prime,right_ptr);
- BlockRead(prime,temp_rec,1);
- box[2].x:=TRUNC(y_offset+pixels_per_unit
- *(temp_rec.y-y_prime_min));
- box[2].y:=TRUNC(z_offset+z_out_max
- -pixels_per_unit*(temp_rec.z-z_prime_min));
- Seek(prime,down_ptr);
- BlockRead(prime,temp_rec,1);
- box[4].x:=TRUNC(y_offset+pixels_per_unit
- *(temp_rec.y-y_prime_min));
- box[4].y:=TRUNC(z_offset+z_out_max
- -pixels_per_unit*(temp_rec.z-z_prime_min));
- Seek(prime,down_ptr+1);
- BlockRead(prime,temp_rec,1);
- box[3].x:=TRUNC(y_offset+pixels_per_unit
- *(temp_rec.y-y_prime_min));
- box[3].y:=TRUNC(z_offset+z_out_max
- -pixels_per_unit*(temp_rec.z-z_prime_min));
- box_y_min:=box[1].y;
- box_y_max:=box_y_min;
- FOR box_num_1:=2 TO 4 DO
- BEGIN
- IF box[box_num_1].y < box_y_min THEN
- box_y_min:=box[box_num_1].y;
- IF box[box_num_1].y > box_y_max THEN
- box_y_max:=box[box_num_1].y
- END;
- FOR box_y1:=box_y_min TO box_y_max DO
- BEGIN
- intercept_count_mod_2:=0;
- box_num_2:=2;
- FOR box_num_1:=1 TO 4 DO
- BEGIN
- IF box[box_num_1].y >= box_y1 THEN
- BEGIN
- IF box_y1 > box[box_num_2].y THEN
- BEGIN
- box_delta_y
- :=box[box_num_2].y-box[box_num_1].y;
- box_delta_x
- :=box[box_num_2].x-box[box_num_1].x;
- box_y_offset:=box_y1-box[box_num_1].y;
- box_x_intercept:=box[box_num_1].x;
- box_x1:=(box_delta_x*box_y_offset)
- DIV box_delta_y+box_x_intercept;
- IF intercept_count_mod_2 = 0 THEN
- box_x2:=box_x1
- ELSE
- BEGIN
- IF box_x1 < box_x2 THEN
- BEGIN
- line_x1:=box_x1;
- line_x2:=box_x2
- END
- ELSE
- BEGIN
- line_x1:=box_x2;
- line_x2:=box_x1
- END;
- pset(line_x1,box_y1,FALSE);
- WHILE (line_x1 < line_x2) DO
- BEGIN
- line_x1:=line_x1+1;
- pset(line_x1,box_y1,FALSE)
- END
- END;
- intercept_count_mod_2
- :=1-intercept_count_mod_2
- END
- END
- ELSE
- BEGIN
- IF box_y1 <= box[box_num_2].y THEN
- BEGIN
- box_delta_y
- :=box[box_num_2].y-box[box_num_1].y;
- box_delta_x
- :=box[box_num_2].x-box[box_num_1].x;
- box_y_offset:=box_y1-box[box_num_1].y;
- box_x_intercept:=box[box_num_1].x;
- box_x1:=(box_delta_x*box_y_offset)
- DIV box_delta_y+box_x_intercept;
- IF intercept_count_mod_2 = 0 THEN
- box_x2:=box_x1
- ELSE
- BEGIN
- IF box_x1 < box_x2 THEN
- BEGIN
- line_x1:=box_x1;
- line_x2:=box_x2
- END
- ELSE
- BEGIN
- line_x1:=box_x2;
- line_x2:=box_x1
- END;
- pset(line_x1,box_y1,FALSE);
- WHILE (line_x1 < line_x2) DO
- BEGIN
- line_x1:=line_x1+1;
- pset(line_x1,box_y1,FALSE)
- END
- END;
- intercept_count_mod_2
- :=1-intercept_count_mod_2
- END
- END;
- box_num_2:=box_num_2+1;
- IF box_num_2 > 4 THEN
- box_num_2:=1
- END
- END;
- box_num_2:=2;
- FOR box_num_1:=1 TO 4 DO
- BEGIN
- line_x1:=box[box_num_1].x;
- line_y1:=box[box_num_1].y;
- line_x2:=box[box_num_2].x;
- line_y2:=box[box_num_2].y;
- box_num_2:=box_num_2+1;
- draw_line(line_x1,line_y1,line_x2,line_y2);
- IF box_num_2 > 4 THEN
- box_num_2:=1
- END
- END
- END;
- prime_ptr:=prime_rec.lesser_x
- END
- END;
- BEGIN
- ClrScr;
- WRITELN(OUTPUT,' Maze Generator');
- WRITELN(OUTPUT,' '); WRITELN(OUTPUT,' '); WRITELN(OUTPUT,' ');
- WRITELN(OUTPUT,' The maze will be outputted to HPMAZE.LST.');
- WRITELN(OUTPUT,' ');
- WRITE(OUTPUT,' Random number seed? ');
- READLN(INPUT,seed);
- r_n_index_1:=1;
- FOR r_n_index_2:=1 TO LENGTH(seed) DO
- BEGIN
- tem_int:=ORD(seed[r_n_index_2]);
- WHILE (tem_int > 29) DO tem_int:=tem_int-29;
- r_n[r_n_index_1]:=tem_int;
- r_n_index_1:=r_n_index_1+1
- END;
- r_n_index_2:=8;
- WHILE (r_n_index_1 > 1) DO
- BEGIN
- r_n_index_1:=r_n_index_1-1;
- r_n[r_n_index_2]:=r_n[r_n_index_1];
- r_n_index_2:=r_n_index_2-1
- END;
- WHILE (r_n_index_2 >= 1) DO
- BEGIN
- r_n[r_n_index_2]:=19;
- r_n_index_2:=r_n_index_2-1
- END;
- delta_x[1,1]:=-1;
- delta_y[1,1]:=0;
- delta_x[2,1]:=0;
- delta_y[2,1]:=1;
- delta_x[3,1]:=1;
- delta_y[3,1]:=0;
- delta_x[4,1]:=0;
- delta_y[4,1]:=-1;
- delta_index_2:=0;
- FOR delta_index_1a:=1 TO 4 DO
- FOR delta_index_1b:=1 TO 4 DO
- IF delta_index_1a <> delta_index_1b THEN
- FOR delta_index_1c:=1 TO 4 DO
- IF ((delta_index_1a <> delta_index_1c)
- AND (delta_index_1b <> delta_index_1c)) THEN
- FOR delta_index_1d:=1 TO 4 DO
- IF ((delta_index_1a <> delta_index_1d)
- AND (delta_index_1b <> delta_index_1d)
- AND (delta_index_1c <> delta_index_1d)) THEN
- BEGIN
- delta_index_2:=delta_index_2+1;
- delta_x[delta_index_1a,delta_index_2]:=delta_x[1,1];
- delta_y[delta_index_1a,delta_index_2]:=delta_y[1,1];
- delta_x[delta_index_1b,delta_index_2]:=delta_x[2,1];
- delta_y[delta_index_1b,delta_index_2]:=delta_y[2,1];
- delta_x[delta_index_1c,delta_index_2]:=delta_x[3,1];
- delta_y[delta_index_1c,delta_index_2]:=delta_y[3,1];
- delta_x[delta_index_1d,delta_index_2]:=delta_x[4,1];
- delta_y[delta_index_1d,delta_index_2]:=delta_y[4,1]
- END;
- max_y_out:=X_DOT_MAX;
- max_z_out:=Y_DOT_MAX;
- FOR y_out:=0 TO MAX_Y DO
- FOR x_out:=0 TO MAX_X DO
- page[y_out,x_out]:='W';
- sum:=0;
- FOR digit_num:=1 TO 3 DO
- BEGIN
- digit:=r_n[1];
- r_n_index_1:=1;
- FOR r_n_index_2:=2 TO 8 DO
- BEGIN
- tem_int:=r_n[r_n_index_2];
- r_n[r_n_index_1]:=tem_int;
- digit:=digit+tem_int;
- IF digit > 29 THEN
- digit:=digit-29;
- r_n_index_1:=r_n_index_2
- END;
- r_n[8]:=digit;
- sum:=29*sum+digit
- END;
- x:=2*(sum MOD NUM_COLUMNS)+1;
- sum:=0;
- FOR digit_num:=1 TO 3 DO
- BEGIN
- digit:=r_n[1];
- r_n_index_1:=1;
- FOR r_n_index_2:=2 TO 8 DO
- BEGIN
- tem_int:=r_n[r_n_index_2];
- r_n[r_n_index_1]:=tem_int;
- digit:=digit+tem_int;
- IF digit > 29 THEN
- digit:=digit-29;
- r_n_index_1:=r_n_index_2
- END;
- r_n[8]:=digit;
- sum:=29*sum+digit
- END;
- y:=2*(sum MOD NUM_ROWS)+1;
- add_room;
- page[0,1]:=' ';
- page[MAX_Y,MAX_X-1]:=' ';
- x_min:=1.0;
- x_max:=MAX_Y;
- x_max:=2.0*x_max+5.0;
- y_min:=1.0;
- y_max:=MAX_X;
- y_max:=2.0*y_max+5.0;
- num_x_divisions:=2*(MAX_Y+3);
- num_y_divisions:=2*(MAX_X+3);
- prime_head:=-1;
- rotation:=20.0;
- tilt:=30.0;
- evaluate_and_transform(x_min,x_max,y_min,y_max,num_x_divisions,
- num_y_divisions,rotation,tilt,x_prime_max,y_prime_min,y_prime_max,
- z_prime_min,z_prime_max);
- Assign(prime,'HPMAZE.TMP');
- Rewrite(prime,Sizeof(prime_record));
- adjust_perspective(x_min,x_max,y_min,y_max,num_x_divisions,num_y_divisions,
- rotation,tilt,prime_head,prime_tail,x_prime_max,y_prime_min,y_prime_max,
- z_prime_min,z_prime_max);
- FOR row_num:=1 TO ROWS_PER_SLICE DO
- New(row_ptr[row_num]);
- Assign(maze,'HPMAZE.LST');
- Rewrite(maze,1);
- BlockWrite(maze,landscape,SizeOf(landscape));
- BlockWrite(maze,dpi_prefix,SizeOf(dpi_prefix));
- Str(DOTS_PER_INCH,ascii_equivalent);
- BlockWrite(maze,ascii_equivalent[1],Length(ascii_equivalent));
- BlockWrite(maze,dpi_suffix,SizeOf(dpi_suffix));
- BlockWrite(maze,logical_mode,SizeOf(logical_mode));
- slice_y_start:=0;
- WHILE (slice_y_start <= Y_DOT_MAX) DO
- BEGIN
- slice_y_stop:=slice_y_start+ROWS_PER_SLICE-1;
- IF slice_y_stop > Y_DOT_MAX THEN
- slice_y_stop:=Y_DOT_MAX;
- FOR row_num:=1 TO ROWS_PER_SLICE DO
- FOR column_num:=0 to X_BYTE_MAX DO
- row_ptr[row_num]^.column[column_num]:=0;
- plot(prime_tail,y_prime_min,y_prime_max,z_prime_min,z_prime_max,
- max_y_out,max_z_out,num_x_divisions,num_y_divisions);
- row_num:=1;
- FOR slice_y:=slice_y_start TO slice_y_stop DO
- BEGIN
- starting_column_num:=0;
- non_null_found:=FALSE;
- WHILE ((starting_column_num <= X_BYTE_MAX) AND (NOT non_null_found)) DO
- IF row_ptr[row_num]^.column[starting_column_num] = 0 THEN
- starting_column_num:=starting_column_num+1
- ELSE
- non_null_found:=TRUE;
- IF non_null_found THEN
- BEGIN
- non_null_found:=FALSE;
- ending_column_num:=X_BYTE_MAX;
- WHILE ((ending_column_num >= 0) AND (NOT non_null_found)) DO
- IF row_ptr[row_num]^.column[ending_column_num] = 0 THEN
- ending_column_num:=ending_column_num-1
- ELSE
- non_null_found:=TRUE;
- BlockWrite(maze,cursor_x_prefix,SizeOf(cursor_x_prefix));
- cursor_x:=8*DOTS_PER_STROKE*starting_column_num;
- Str(cursor_x,ascii_equivalent);
- BlockWrite(maze,ascii_equivalent[1],Length(ascii_equivalent));
- BlockWrite(maze,cursor_x_suffix,SizeOf(cursor_x_suffix));
- BlockWrite(maze,cursor_y_prefix,SizeOf(cursor_y_prefix));
- cursor_y:=DOTS_PER_STROKE*slice_y;
- Str(cursor_y,ascii_equivalent);
- BlockWrite(maze,ascii_equivalent[1],Length(ascii_equivalent));
- BlockWrite(maze,cursor_y_suffix,SizeOf(cursor_y_suffix));
- BlockWrite(maze,raster_prefix,SizeOf(raster_prefix));
- BlockWrite(maze,row_prefix,SizeOf(row_prefix));
- num_bytes:=ending_column_num-starting_column_num+1;
- Str(num_bytes,ascii_equivalent);
- BlockWrite(maze,ascii_equivalent[1],Length(ascii_equivalent));
- BlockWrite(maze,row_suffix,SizeOf(row_suffix));
- BlockWrite(maze,row_ptr[row_num]^.column[starting_column_num],
- num_bytes);
- BlockWrite(maze,raster_suffix,SizeOf(raster_suffix))
- END;
- row_num:=row_num+1
- END;
- slice_y_start:=slice_y_start+ROWS_PER_SLICE
- END;
- Close(maze);
- Close(prime);
- Erase(prime);
- FOR row_num:=1 TO ROWS_PER_SLICE DO
- Dispose(row_ptr[row_num])
- END.