00001 REM TACKER: papa (David Meyer)
00002 REM DATE: 10-Aug-16 18:02:32
00003 REM CHECKED: BASIC-10, bwbasic, bas
00100 rem ***********************************************************
00110 rem *** MCCRCL.BAS - Plot Minecraft block circle
00120 rem *** 2016 David Meyer <
[email protected]> +JMJ
00130 rem ***
00140 rem *** DESCRIPTION
00150 rem *** A tool for designing circular structures in the game
00160 rem *** Minecraft. Determine blocks within a circle of a given
00170 rem *** and make a 2D plot.
00180 rem ***
00190 rem *** A plot may be block-centered, diameter is odd number
00200 rem *** of blocks and axes run through center of blocks in a
00210 rem *** row/column, or edge-centered, diameter is evn number
00220 rem *** of blocks and axes run along edge between block rows/
00230 rem *** columns.
00240 rem ***
00250 rem *** VARIABLES
00260 rem *** B Block-centered flag
00270 rem *** C0 Column index
00280 rem *** D Circle diameter blocks
00290 rem *** R Circle radius blocks (excludes axis if block-centered)
00300 rem *** R0 Row index
00310 rem *** S Distance of block (R0,C0) datum from origin
00320 rem ***
00330 rem *** ARRAYS
00340 rem *** Q2 Quadrant semi-chord block counts
00350 rem ***
00360 rem ***********************************************************
00370 rem
00380 goto 800
00390 rem
00400 rem ** SUBROUTINES
00410 rem
00420 rem ** Print exterior block
00430 print " ";
00440 return
00450 rem ** Print interior block
00460 print "[]";
00470 return
00480 rem ** Print vertical axis [IN: B]
00490 if not (b = -1) then goto 520
00500 print "[|]";
00510 goto 540
00520 rem ELSE
00530 print "|";
00540 rem END IF
00550 return
00560 rem ** Print left horizontal axis [IN: B]
00570 if not (b = -1) then goto 600
00580 print "[-";
00590 goto 620
00600 rem ELSE
00610 print "--";
00620 rem END IF
00630 return
00640 rem ** Print origin [IN: B]
00650 if not (b = -1) then goto 680
00660 print "[+]";
00670 goto 700
00680 rem ELSE
00690 print "+";
00700 rem END IF
00710 return
00720 rem ** Print right horizontal axis [IN: B]
00730 if not (b = -1) then goto 760
00740 print "-]";
00750 goto 780
00760 rem ELSE
00770 print "--";
00780 rem END IF
00790 return
00800 rem ** MAIN ROUTINE
00810 rem
00820 dim q2(16)
00830 print "MINECRAFT BLOCK CIRCLE PLOTTER"
00840 print
00850 print "How many blocks is the circle diameter (<=32, 0 to quit)";
00860 input d
00870 print
00880 rem * Main loop exit check
00890 if not(d=0) then goto 910
00900 stop
00910 rem END IF
00920 let r=int(d/2)
00930 if not (d <> 2*r) then goto 960
00940 let b = -1
00950 goto 980
00960 rem ELSE
00970 let b = 0
00980 rem END IF
00990 rem let b=not fne(d)
01000 rem * Check quadrant blocks by horiz. row
01010 for r0=1 to r
01020 let q2(r0)=0
01030 rem * Check quadrant row blocks by vert. column
01040 for c0=1 to r
01050 if not (b = -1) then goto 1090
01060 rem * Block-centered datum: block vertex closest to origin
01070 let s=sqr((r0-0.5)^2+(c0-0.5)^2)
01080 goto 1130
01090 rem ELSE
01100 rem let s=sqr((r0-1)^2+(c0-1)^2)
01110 rem * Edge-centered datum: block center
01120 let s=sqr((r0-.5)^2+(c0-.5)^2)
01130 rem END IF
01140 rem * Block (R0,C0) inside circle check
01150 if not(s<=r) then goto 1170
01160 let q2(r0)=q2(r0)+1
01170 rem END IF
01180 next c0
01190 next r0
01200 rem * Plot upper semicircle
01210 for r0=r to 1 step -1
01220 rem * Print row block count
01230 if not (b = -1) then goto 1260
01240 print q2(r0)*2+1,
01250 goto 1280
01260 rem ELSE
01270 print q2(r0)*2,
01280 rem END IF
01290 rem * Print filler exterior blocks
01300 for n=1 to r-q2(r0)
01310 gosub 420
01320 next n
01330 rem * Print interior blocks (left quadrant)
01340 for n=1 to q2(r0)
01350 gosub 450
01360 next n
01370 rem * Print vertical axis
01380 gosub 480
01390 rem * Print interior blocks (right quadrant)
01400 for n=1 to q2(r0)
01410 gosub 450
01420 next n
01430 print
01440 next r0
01450 rem * Print horizontal axis (left side)
01460 if not (b = -1) then goto 1490
01470 print d,
01480 goto 1510
01490 rem ELSE
01500 print " ",
01510 rem END IF
01520 for c0=1 to r
01530 gosub 560
01540 next c0
01550 rem * Print origin
01560 gosub 640
01570 rem * Print horizontal axis (right side)
01580 for c0=1 to r
01590 gosub 720
01600 next c0
01610 print
01620 rem * Plot lower semicircle
01630 for r0=1 to r
01640 rem * Print row block count
01650 if not (b = -1) then goto 1680
01660 print q2(r0)*2+1,
01670 goto 1700
01680 rem ELSE
01690 print q2(r0)*2,
01700 rem END IF
01710 rem * Print filler exterior blocks
01720 for n=1 to r-q2(r0)
01730 gosub 420
01740 next n
01750 rem * Print interior blocks (left quadrant)
01760 for n=1 to q2(r0)
01770 gosub 450
01780 next n
01790 rem * Print vertical axis
01800 gosub 480
01810 rem * Print interior blocks (right quadrant)
01820 for n=1 to q2(r0)
01830 gosub 450
01840 next n
01850 print
01860 next r0
01870 print
01880 goto 850
01890 end