program cube; const Cw = 640; Ch = 400; Vw = 4; Vh = 3; D = 3.5; RED = 2; GREEN = 3; BLUE = 4; type point2d = record x,y:real; end; point3d = record x,y,z:real; end; var vAf,vBf,vCf,vDf:point3d; vAb,vBb,vCb,vDb:point3d; function viewportToCanvas(x,y:real):point2d; begin viewportToCanvas.x := x * Cw/Vw; viewportToCanvas.y := y * Ch/Vh; end; function projectVertex(v:point3d):point2d; begin projectVertex := viewportToCanvas(v.x * D / v.z, v.y * D / v.z); end; procedure initPoint3d(var p:point3d;x,y,z:real); begin p.x := x; p.y := y; p.z := z; end; procedure DrawLine2d(p1,p2:point2d; color:integer); begin drawline(Cw div 2 + trunc(p1.x),Ch div 2 + trunc(p1.y), Cw div 2 + trunc(p2.x), Ch div 2 + trunc(p2.y), color); end; begin initGraphics; (* The four "front" vertices *) initPoint3d(vAf,-2.0, -0.5, 5.0); initPoint3d(vBf,-2.0, 0.5, 5.0); initPoint3d(vCf,-1.0, 0.5, 5.0); initPoint3d(vDf,-1.0, -0.5, 5.0); (* The four "back" vertices *) (* vAb = [-2, -0.5, 6] vBb = [-2, 0.5, 6] vCb = [-1, 0.5, 6] vDb = [-1, -0.5, 6] *) initPoint3d(vAb,-2.0, -0.5, 6.0); initPoint3d(vBb,-2.0, 0.5, 6.0); initPoint3d(vCb,-1.0, 0.5, 6.0); initPoint3d(vDb,-1.0, -0.5, 6.0); (* The front face *) DrawLine2d(ProjectVertex(vAf), ProjectVertex(vBf), BLUE); DrawLine2d(ProjectVertex(vBf), ProjectVertex(vCf), BLUE); DrawLine2d(ProjectVertex(vCf), ProjectVertex(vDf), BLUE); DrawLine2d(ProjectVertex(vDf), ProjectVertex(vAf), BLUE); (* The back face *) DrawLine2d(ProjectVertex(vAb), ProjectVertex(vBb), RED); DrawLine2d(ProjectVertex(vBb), ProjectVertex(vCb), RED); DrawLine2d(ProjectVertex(vCb), ProjectVertex(vDb), RED); DrawLine2d(ProjectVertex(vDb), ProjectVertex(vAb), RED); (* The front-to-back edges *) DrawLine2d(ProjectVertex(vAf), ProjectVertex(vAb), GREEN); DrawLine2d(ProjectVertex(vBf), ProjectVertex(vBb), GREEN); DrawLine2d(ProjectVertex(vCf), ProjectVertex(vCb), GREEN); DrawLine2d(ProjectVertex(vDf), ProjectVertex(vDb), GREEN); end.