Draw a cuboid: Difference between revisions

Added PL/M
(Added PL/M)
 
(2 intermediate revisions by the same user not shown)
Line 203:
| |/
+----+ </pre>
 
=={{header|ALGOL 68}}==
Draws a static cuboid using ASCII art - orientated in the same fashion as in the Befunge sample.<br/>
(I'm not au-fait with Befunge, so I've no idea how similar the algorithm is...)
<syntaxhighlight lang="algol68">
BEGIN # draw some cuboids using ASCII art #
 
# draws a cuboid standing on one edge using ASCII art #
PROC aa cuboid = ( INT h, w, l )VOID:
BEGIN
# top line #
FOR i TO l DO print( ( " " ) ) OD;
FOR i TO w + 1 DO print( ( "_" ) ) OD;
print( ( newline ) );
# rest of the top face and part of the visible side #
INT face width := 0;
INT edge pos := 0;
FOR i TO l DO
FOR j TO l - i DO print( ( " " ) ) OD;
print( ( "/" ) );
FOR j TO w DO print( ( IF i = l THEN "_" ELSE " " FI ) ) OD;
print( ( "/" ) );
edge pos +:= 1;
IF edge pos <= h THEN
# drsw the back edge #
face width := 2 * ( edge pos - 1 );
FOR j TO face width DO print( ( " " ) ) OD;
print( ( "\" ) )
ELSE
# draw the bottom edge #
FOR j TO face width + 1 DO print( ( " " ) ) OD;
print( ( "/" ) )
FI;
print( ( newline ) )
OD;
# other vidible face #
FOR i TO h DO
FOR j TO i - 1 DO print( ( " " ) ) OD;
print( ( "\" ) );
FOR j TO w DO print( ( IF i = h THEN "_" ELSE " " FI ) ) OD;
print( ( "\" ) );
edge pos +:= 1;
IF edge pos <= h THEN
# drsw the back edge #
FOR j TO face width + 1 DO print( ( " " ) ) OD;
print( ( "\" ) )
ELSE
# draw the bottom edge #
FOR j TO face width DO print( ( " " ) ) OD;
face width -:= 2;
print( ( "/" ) )
FI;
print( ( newline ) )
OD
END # aa cuboid # ;
 
aa cuboid( 3, 2, 4 );
aa cuboid( 4, 3, 2 );
aa cuboid( 2, 4, 3 );
aa cuboid( 2, 3, 4 )
 
END
</syntaxhighlight>
{{out}}
<pre>
___
/ /\
/ / \
/ / \
/__/ /
\ \ /
\ \ /
\__\/
____
/ /\
/___/ \
\ \ \
\ \ \
\ \ /
\___\/
_____
/ /\
/ / \
/____/ /
\ \ /
\____\/
____
/ /\
/ / \
/ / /
/___/ /
\ \ /
\___\/
</pre>
 
=={{header|Arturo}}==
Line 3,431 ⟶ 3,526:
 
(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}}==
3,049

edits