Draw a cuboid: Difference between revisions
Content deleted Content added
m →{{header|ALGOL 68}}: notes |
Added PL/M |
||
Line 3,526: | Line 3,526: | ||
(glutMainLoop)</syntaxhighlight> |
(glutMainLoop)</syntaxhighlight> |
||
=={{header|PL/M}}== |
|||
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator) |
|||
{{Trans|ALGOL 68}} |
|||
<syntaxhighlight lang="plm"> |
|||
100H: /* DRAW SOME CUBOIDS USING ASCII ART */ |
|||
/* CP/M BDOS SYSTEM CALL AND I/O ROUTINES */ |
|||
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END; |
|||
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END; |
|||
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END; |
|||
/* TASK */ |
|||
/* DRAWS A CUBOID STANDING ON ONE EDGE USING ASCII ART */ |
|||
DRAW$CUBOID: PROCEDURE( H, W, L ); |
|||
DECLARE ( H, W, L ) BYTE; |
|||
DECLARE ( I, J, FACE$WIDTH, EDGE$POS ) BYTE; |
|||
BACKSLASH: PROCEDURE; CALL PR$CHAR( 92 ); END; /* PRINTS A BACKSLASH */ |
|||
REPEAT$CHAR: PROCEDURE( CH, COUNT ); /* PRINTS CH COUNT TIMES */ |
|||
DECLARE ( CH, COUNT ) BYTE; |
|||
DECLARE I BYTE; |
|||
IF COUNT > 0 THEN DO; |
|||
DO I = 1 TO COUNT; CALL PR$CHAR( CH ); END; |
|||
END; |
|||
END REPEAT$CHAR; |
|||
UNDERSCORES: PROCEDURE( COUNT ); /* PRINTS COUNT UNDERSCORES */ |
|||
DECLARE COUNT BYTE; |
|||
CALL REPEAT$CHAR( 95, COUNT ); |
|||
END UNDERSCORES; |
|||
/* TOP LINE */ |
|||
CALL REPEAT$CHAR( ' ', L ); CALL UNDERSCORES( W + 1 ); CALL PR$NL; |
|||
/* REST OF THE TOP FACE AND PART OF THE VISIBLE SIDE */ |
|||
FACE$WIDTH = 0; |
|||
EDGE$POS = 0; |
|||
DO I = 1 TO L; |
|||
CALL REPEAT$CHAR( ' ', L - I ); |
|||
CALL PR$CHAR( '/' ); |
|||
IF I = L THEN CALL UNDERSCORES( W ); |
|||
ELSE CALL REPEAT$CHAR( ' ', W ); |
|||
CALL PR$CHAR( '/' ); |
|||
EDGE$POS = EDGE$POS + 1; |
|||
IF EDGE$POS <= H THEN DO; |
|||
/* DRAW THE BACK EDGE */ |
|||
FACE$WIDTH = 2 * ( EDGE$POS - 1 ); |
|||
CALL REPEAT$CHAR( ' ', FACE$WIDTH ); |
|||
CALL BACKSLASH; |
|||
END; |
|||
ELSE DO; |
|||
/* DRAW THE BOTTOM EDGE AND THE MORE OF THE VISIBLE SIDE */ |
|||
CALL REPEAT$CHAR( ' ', FACE$WIDTH + 1 ); |
|||
CALL PR$CHAR( '/' ); |
|||
END; |
|||
CALL PR$NL; |
|||
END; |
|||
/* OTHER VISIBLE FACE */ |
|||
DO I = 1 TO H; |
|||
CALL REPEAT$CHAR( ' ', I - 1 ); |
|||
CALL BACKSLASH; |
|||
IF I = H THEN CALL UNDERSCORES( W ); |
|||
ELSE CALL REPEAT$CHAR( ' ', W ); |
|||
CALL BACKSLASH; |
|||
EDGE$POS = EDGE$POS + 1; |
|||
IF EDGE$POS <= H THEN DO; |
|||
/* DRAW THE BACK EDGE */ |
|||
CALL REPEAT$CHAR( ' ', FACE$WIDTH + 1 ); |
|||
CALL BACKSLASH; |
|||
END; |
|||
ELSE DO; |
|||
/* DRAW THE BOTTOM EDGE */ |
|||
CALL REPEAT$CHAR( ' ', FACE$WIDTH ); |
|||
FACE$WIDTH = FACE$WIDTH - 2; |
|||
CALL PR$CHAR( '/' ); |
|||
END; |
|||
CALL PR$NL; |
|||
END; |
|||
END DRAW$CUBOID; |
|||
CALL DRAW$CUBOID( 3, 2, 4 ); |
|||
CALL DRAW$CUBOID( 4, 3, 2 ); |
|||
CALL DRAW$CUBOID( 2, 4, 3 ); |
|||
CALL DRAW$CUBOID( 2, 3, 4 ); |
|||
EOF |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
___ |
|||
/ /\ |
|||
/ / \ |
|||
/ / \ |
|||
/__/ / |
|||
\ \ / |
|||
\ \ / |
|||
\__\/ |
|||
____ |
|||
/ /\ |
|||
/___/ \ |
|||
\ \ \ |
|||
\ \ \ |
|||
\ \ / |
|||
\___\/ |
|||
_____ |
|||
/ /\ |
|||
/ / \ |
|||
/____/ / |
|||
\ \ / |
|||
\____\/ |
|||
____ |
|||
/ /\ |
|||
/ / \ |
|||
/ / / |
|||
/___/ / |
|||
\ \ / |
|||
\___\/ |
|||
</pre> |
|||
=={{header|POV-Ray}}== |
=={{header|POV-Ray}}== |