### Graphics utilities: H/V lines, grids and tiles

Posted:

**Tue Sep 24, 2019 3:18 pm**0. Abstract

My ultimate goal is to draw a chess board. To achieve this in a modular

fashion, we'll need tools to draw lines horizontally and vertically, use these

to draw a grid, and then be able to fill half of the grid cells with a shading

pattern. So, without further ado:

1. HLINE

HLINE draws a horizontal line of n points.

If n is positive, it draws to the right, else to the left of the starting point.

It will accept either two reals, a complex number, or a matrix of complex

numbers and return the endpoint in the same format as it was entered.

The routine is mode-independent, does not use subroutines, and only 3 stack

levels in case the coordinates are complex numbers or a complex matrix.

Works on all flavours of the 42, even a real one.

HLIND draws a double-width line (one pixel more downward)

2. VLINE

VLINE draws a vertical line of n points.

If n is positive, it draws downward, else upward.

It will accept either two reals, a complex number, or a matrix of complex

numbers and returns the endpoint in the same format as it was entered.

The routine depends on RECT mode and uses only the stack.

VLIND draws a double-width line (one pixel more to the right)

3. GRID

[R] is the real matrix of x-coefficients to draw the vertical lines

[C] is the real matrix of y-coefficients to draw the horizontal lines

We may draw a rectangular grid defined by a row and column matrix of coefficients.

The dimensions of the matrix do not really matter, only the number of elements.

To draw a square grid, simply enter the same matrix twice with ENTER.

The usage is best illustrated with an example (that will work on a real 42S as well):

A Sudoku grid (on the DM42, GrMod=2):

4. FILL (tiling)

FILL will fill the box defined by (x0,y0) and (x1,y1) with the pattern as specified in

the Alpha register.

It will determine the height of the pattern, and the size of the box, and execute FILLh:

FILLh accepts the upper left corner of the box (x0,y0) in Z, its dimensions (dx,dy) in Y

and the height of the pattern h in x - and the pattern itself in Alpha.

Contrary to FILL, FILLh will accept a Nx1 matrix of coefficients in Z, all with the same

dimensions (dx,dy), and fill all the boxes.

Again, FILL and FILLh are entirely stack-based. RECT mode is needed, and assumed.

FILLh uses two auxiliary routines M0N and Mx+:

M0N

n XEQ "M0N" will create the 1xn matrix [[ 0 1 .. n-1 ]]

Mx+

Problem: combine an nx1 and 1xm matrix to produce an nxm matrix,

but instead of multiplying each combination of the elements, add them instead.

This occurs frequently when trying to create a grid of coordinates, so assume

the entries are all integers < 1000.

eg. to combine
into

do

5. CHESS

Only the board, I'm afraid. So, bringing it all together, this routine draws a chess board in GrMod=2

(the shading is actually done in GrMod=3). It leaves GrMod=3 upon return.

All routines are combined into a single file for easy download to the DM42, in attachment as a .raw file, or plain source here:

Comments etc. welcome!

Cheers, Werner

My ultimate goal is to draw a chess board. To achieve this in a modular

fashion, we'll need tools to draw lines horizontally and vertically, use these

to draw a grid, and then be able to fill half of the grid cells with a shading

pattern. So, without further ado:

1. HLINE

Code: Select all

```
X Y Z T
In: n x0 y0
n (x0,y0)
n [(x0,y0) (x1,y1) .. ]
Out: endpoint = start+n-1 n>0
= start n=0
= start+n+1 n<0
```

If n is positive, it draws to the right, else to the left of the starting point.

It will accept either two reals, a complex number, or a matrix of complex

numbers and return the endpoint in the same format as it was entered.

The routine is mode-independent, does not use subroutines, and only 3 stack

levels in case the coordinates are complex numbers or a complex matrix.

Works on all flavours of the 42, even a real one.

HLIND draws a double-width line (one pixel more downward)

2. VLINE

Code: Select all

```
X Y Z T
In: n x0 y0
n (x0,y0)
n [(x0,y0) (x1,y1) .. ]
Out: endpoint = start+n-1 n>0
= start n=0
= start+n+1 n<0
```

If n is positive, it draws downward, else upward.

It will accept either two reals, a complex number, or a matrix of complex

numbers and returns the endpoint in the same format as it was entered.

The routine depends on RECT mode and uses only the stack.

VLIND draws a double-width line (one pixel more to the right)

3. GRID

Code: Select all

```
X Y Z T
In: [R] [C]
```

[C] is the real matrix of y-coefficients to draw the horizontal lines

We may draw a rectangular grid defined by a row and column matrix of coefficients.

The dimensions of the matrix do not really matter, only the number of elements.

To draw a square grid, simply enter the same matrix twice with ENTER.

The usage is best illustrated with an example (that will work on a real 42S as well):

Code: Select all

```
Y: [ 1 6 11 16 ]
X: [ 1 27 53 79 105 131 ]
XEQ "GRID"
```

Code: Select all

```
X: [ 4 5 17 29 41 42 54 66 78 79 91 103 115 116 ]
ENTER
XEQ "GRID"
```

Code: Select all

```
X Y Z T Alpha
In: (x1,y1) (x0,y0) pattern
```

the Alpha register.

It will determine the height of the pattern, and the size of the box, and execute FILLh:

Code: Select all

```
X Y Z T Alpha
[[][]]
In: h (dx,dy) (x0,y0) pattern
```

and the height of the pattern h in x - and the pattern itself in Alpha.

Contrary to FILL, FILLh will accept a Nx1 matrix of coefficients in Z, all with the same

dimensions (dx,dy), and fill all the boxes.

Again, FILL and FILLh are entirely stack-based. RECT mode is needed, and assumed.

FILLh uses two auxiliary routines M0N and Mx+:

M0N

n XEQ "M0N" will create the 1xn matrix [[ 0 1 .. n-1 ]]

Mx+

Problem: combine an nx1 and 1xm matrix to produce an nxm matrix,

but instead of multiplying each combination of the elements, add them instead.

This occurs frequently when trying to create a grid of coordinates, so assume

the entries are all integers < 1000.

eg. to combine

Code: Select all

```
[[ 1 ] and [[ 4 5 ]]
[ 2 ]
[ 3 ]]
```

Code: Select all

```
[[ (1,4) (1,5) ]
[ (2,4) (2,5) ]
[ (3,4) (3,5) ]]
```

Code: Select all

```
[[ 1 ][ 2 ][ 3 ]] ( 3x1 matrix )
[[ 4 5 ]] ( 1x2 matrix )
FP ( multiply by i )
LASTX
COMPLEX ( [[ (0,4) (0,5) ]] )
XEQ "Mx+"
```

5. CHESS

Only the board, I'm afraid. So, bringing it all together, this routine draws a chess board in GrMod=2

(the shading is actually done in GrMod=3). It leaves GrMod=3 upon return.

All routines are combined into a single file for easy download to the DM42, in attachment as a .raw file, or plain source here:

Code: Select all

```
00 { 127-Byte Prgm }
01▶LBL "HLIND"
02 "∫"
03 GTO 00
04▶LBL "HLINE"
05 "×"
06▶LBL 00
07 SIGN
08 X<0?
09 STO- ST Y
10 X<> ST L
11 44
12 X<Y?
13 GTO 00
14 +/-
15 X≤Y?
16 GTO 01
17▶LBL 00
18 ASTO ST L
19 ARCL ST L
20 ASTO ST L
21 ARCL ST L
22 ASTO ST L
23 ARCL ST L
24 ASTO ST L
25 ARCL ST L
26 ARCL ST L
27 ARCL ST L
28 ARCL ST L
29 ARCL ST L
30 ARCL ST L
31 X<0?
32 GTO 03
33▶LBL 02
34 -
35 R↓
36 AGRAPH
37 R^
38 LASTX
39 STO+ ST Z
40 X<Y?
41 GTO 02
42 GTO 01
43▶LBL 03
44 STO+ ST Z
45 -
46 R↓
47 AGRAPH
48 R^
49 LASTX
50 X>Y?
51 GTO 03
52▶LBL 01
53 R↓
54 X=0?
55 GTO 00
56 X<0?
57 STO+ ST Y
58 SIGN
59 LASTX
60 NEWMAT
61 ATOX
62 STO+ ST Y
63 R↓
64 CLA
65 XTOA
66 R↓
67 AGRAPH
68 LASTX
69 ENTER
70 X>0?
71 SIGN
72 -
73▶LBL 00
74 +
75 END
00 { 159-Byte Prgm }
01▶LBL "VLIND"
02 AON
03▶LBL "VLINE"
04 255
05 CLA
06 XTOA
07 FS? 48
08 XTOA
09 R↓
10 STO ST T
11 R↓
12 AOFF
13 REAL?
14 GTO 00
15 COMPLEX
16 X<>Y
17 AON
18▶LBL 00
19 X<>Y
20 R^
21 X<0?
22 GTO 01
23 8
24 X≥Y?
25 GTO 00
26▶LBL 02
27 R↓
28 R↓
29 COMPLEX
30 AGRAPH
31 COMPLEX
32 R↓
33 R↓
34 STO+ ST Z
35 STO- ST Y
36 X<Y?
37 GTO 02
38 GTO 00
39▶LBL 01
40 SIGN
41 STO- ST Y
42 X<> ST L
43 -8
44 X≤Y?
45 GTO 00
46▶LBL 03
47 STO+ ST Z
48 R↓
49 R↓
50 COMPLEX
51 AGRAPH
52 COMPLEX
53 R↓
54 R↓
55 STO- ST Y
56 X>Y?
57 GTO 03
58▶LBL 00
59 R↓
60 X=0?
61 GTO 00
62 2
63 1/X
64 X<Y?
65 1/X
66 X<>Y
67 Y^X
68 DSE ST X
69 ALENG
70 X<>Y
71 CLA
72 XTOA
73 DSE ST Y
74 XTOA
75 R↓
76 R↓
77 LASTX
78 X<0?
79 STO+ ST Y
80 R↓
81 COMPLEX
82 AGRAPH
83 COMPLEX
84 R^
85 ENTER
86 SIGN
87 -
88 X>0?
89 STO+ ST Y
90▶LBL 00
91 R↓
92 X<>Y
93 FC? 48
94 RTN
95 X<>Y
96 COMPLEX
97 AOFF
98 END
00 { 62-Byte Prgm }
01▶LBL "GRID"
02 CLLCD
03 XEQ 14
04 COMPLEX
05 X<>Y
06 XEQ "HLINE"
07 COMPLEX
08 X<>Y
09 R↓
10 XEQ 14
11 X<>Y
12 COMPLEX
13 X<>Y
14 XEQ "VLINE"
15 RTN
16▶LBL 14
17 EDIT
18 SIGN
19 LASTX
20 ←
21 STO+ ST Y
22 EXITALL
23 X<>Y
24 LASTX
25 STO- ST Y
26 R^
27 STO+ ST Y
28 STO- ST Y
29 END
00 { 25-Byte Prgm }
01▶LBL "M0N"
02 SIGN
03 LASTX
04 NEWMAT
05 EDIT
06 DSE ST L
07▶LBL 02
08 ←
09 LASTX
10 DSE ST L
11 GTO 02
12 EXITALL
13 END
00 { 23-Byte Prgm }
01▶LBL "M×+"
02 9
03 1/X
04 1/X
05 FP
06 1/X
07 STO+ ST Y
08 STO+ ST Z
09 ÷
10 STO× ST Y
11 X<> ST L
12 -
13 END
00 { 95-Byte Prgm }
01▶LBL "FILL"
02 1
03 ENTER
04 COMPLEX
05 +
06 RCL- ST Y
07 ALENG
08 ABS
09 CLX
10▶LBL 02
11 ATOX
12 XTOA
13 X>Y?
14 X<>Y
15 R↓
16 DSE ST L
17 GTO 02
18 LOG
19 2
20 LOG
21 ÷
22 IP
23 1
24 +
25▶LBL "FILLh"
26 X<>Y
27 COMPLEX
28 R↓
29 X<>Y
30 STO÷ ST T
31 COMPLEX
32 R^
33 XEQ "M0N"
34 X<>Y
35 COMPLEX
36 X<>Y
37 R↓
38 ×
39 FP
40 LASTX
41 COMPLEX
42 XEQ "M×+"
43 X<>Y
44▶LBL 04
45 X<>Y
46 AGRAPH
47 X<>Y
48 ALENG
49 STO+ ST Z
50 -
51 X>0?
52 GTO 04
53 END
00 { 172-Byte Prgm }
01▶LBL "CHESS"
02 2
03 XEQ 14
04 CLLCD
05 9
06 XEQ "M0N"
07 13
08 ×
09 5
10 +
11 TRANS
12 EDIT
13 ENTER
14 INSR
15 SIGN
16 -
17 ←
18 GROW
19 ENTER
20 →
21 SIGN
22 +
23 EXITALL
24 ENTER
25 XEQ "GRID"
26 3
27 XEQ 14
28 CLA
29 85
30 XTOA
31 STO+ ST X
32 XTOA
33 ASTO ST X
34 ARCL ST X
35 ARCL ST X
36 ASTO ST X
37 ARCL ST X
38 ARCL ST X
39 ARCL ST X
40 4
41 XEQ "M0N"
42 52
43 ×
44 RCL ST X
45 11
46 +
47 TRANS
48 X<>Y
49 37
50 +
51 FP
52 LASTX
53 COMPLEX
54 XEQ "M×+"
55 STO "."
56 16
57 1
58 DIM "."
59 RCL "."
60 XEQ 13
61 RCL "."
62 CLV "."
63 COMPLEX
64 X<>Y
65 COMPLEX
66▶LBL 13
67 24
68 ENTER
69 COMPLEX
70 8
71 XEQ "FILLh"
72 RTN
73▶LBL 14
74 STO "GrMod"
75 END
```

Cheers, Werner