§ Рисование графония

Можно ходить, используя различные стрелки.
SCREEN 7, 1, 1, 0 DIM SHARED Znear Znear = .5 TYPE vec3: x AS SINGLE: y AS SINGLE: z AS SINGLE: END TYPE TYPE vec2: x AS SINGLE: y AS SINGLE: END TYPE DIM a1 AS vec3, a2 AS vec3, rot AS vec3, org AS vec3 size = 16 org.x = 0: org.y = -.25: org.z = 0 rot.x = 0: rot.y = 2: rot.z = 0 DO LINE (0, 0)-(320, 200), 0, BF ' Horizontal lines FOR x = -size TO size a1.x = x: a1.y = 0: a1.z = -size a2.x = x: a2.y = 0: a2.z = size pd a1, a2, org, rot NEXT ' Vertical lines FOR z = -size TO size a1.x = -size: a1.y = 0: a1.z = z a2.x = size: a2.y = 0: a2.z = z pd a1, a2, org, rot NEXT PCOPY 1, 0 DO: i$ = INKEY$: LOOP WHILE i$ = "" IF i$ = CHR$(0) + "H" THEN org.x = org.x - SIN(rot.y) * .1: org.z = org.z - COS(rot.y) * .1 IF i$ = CHR$(0) + "P" THEN org.x = org.x + SIN(rot.y) * .1: org.z = org.z + COS(rot.y) * .1 IF i$ = CHR$(0) + "K" THEN rot.y = rot.y - .05 IF i$ = CHR$(0) + "M" THEN rot.y = rot.y + .05 IF i$ = CHR$(0) + "I" THEN org.y = org.y - .1 IF i$ = CHR$(0) + "Q" THEN org.y = org.y + .1 LOOP UNTIL i$ = CHR$(27)SUB pd (v1 AS vec3, v2 AS vec3, o AS vec3, r AS vec3) DIM a AS vec3, b AS vec3, e AS vec3 DIM c AS vec2, d AS vec2 ' Move coordinates a.x = v1.x + o.x: b.x = v2.x + o.x a.y = v1.y + o.y: b.y = v2.y + o.y a.z = v1.z + o.z: b.z = v2.z + o.z ' RotateY rt a, r rt b, r ' Cross z-near t = (Znear - a.z) / (b.z - a.z) e.x = a.x + t * (b.x - a.x) e.y = a.y + t * (b.y - a.y) e.z = a.z + t * (b.z - a.z) ' Line behind Znear IF a.z < Znear AND b.z < Znear THEN EXIT SUB ' Line crossing Znear IF a.z > Znear AND b.z < Znear THEN b = e ELSE IF a.z < Znear AND b.z > Znear THEN a = e vp a, c vp b, d LINE (c.x, c.y)-(d.x, d.y), 15 END SUBSUB rt (v AS vec3, r AS vec3) DIM m AS vec3 ' Rotate by Y m.x = v.x * COS(r.y) - v.z * SIN(r.y) m.y = v.y m.z = v.z * COS(r.y) + v.x * SIN(r.y) v = m END SUBSUB vp (a AS vec3, b AS vec2) b.x = 160 + a.x * 200 / a.z b.y = 100 - a.y * 200 / a.z END SUB