Page 1 of 1

CIRCLE IN BASIC.

Posted: Sun May 21, 2023 10:19 pm
by ahenry3068
CODE TO DRAW A CIRCLE IN BASIC. SCREEN $80
WILL CLIP AT EDGES OF SCREEN.

HAS OPTION TO FILL BUT THAT IS QUITE SLOW AND LEAVES A FEW RANDOM
PIXELS UNFILLED DUE TO LACK OF FLOAT PRECISION.

Code: Select all

REM SAMPLE CIRCLE DRAWING WITHOUT THE CIRCLE COMMAND

10 PI = 3.14159265
20 XLIMIT = 319
30 YLIMIT = 239

REM X CENTER
40 CX = 70
REM Y CENTER 
50 CY = 120
REM RA IS RADIUS
60 RA = 40
REM CHANGE FILL TO 1 TO DRAW A SOLID CIRCLE CC IS COLOR 
70 CC = 12:FILL = 0 



80 SCREEN $80
85 RECT 0,0,XLIMIT,YLIMIT,16
90 GOSUB 3000
100 INPUT X$:SCREEN 0:END

REM  CX IS CIRCLE X CENTER
REM  CY IS CIRCLE Y CENTER
REM  RA IS CIRCLE RADIUS
REM  CC IS CIRCLE COLOR
REM  FI IS FILL SET TO 1 TO DRAW A FILLED CIRCLE 
REM  XL IS XLIMIT
REM  YL IS YLIMIT


3000 Q = 1 / RA
3005 FOR I = 0 TO PI / 2 STEP Q
3010    DY = SIN(I) * RA
3020    DX = COS(I) * RA
3050    ZX = INT(CX - DX)
3070    ZY = INT(CY - DY)
3090    AX = INT(CX + DX)
3110    AY = INT(CY + DY)
3120    IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT THEN 3140
3130    PSET AX, AY, CC
3140    IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT THEN 3160
3150    PSET ZX, AY, CC
3160    IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3180
3170    PSET AX, ZY, CC
3180    IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3210
3190    PSET ZX, ZY, CC
3210 NEXT I
3220 IF FILL <> 1 THEN RETURN
3230 FILL = 0 
3240 J = RA
3250 RA = RA - 1
3260 IF RA > 0 THEN GOSUB 3000
3270 IF RA > 0 THEN 3250 
3280 RA = J:FILL = 1
3290 RETURN



100 RANDOM CIRCLES

Posted: Sun May 21, 2023 11:17 pm
by ahenry3068
DRAWS 100 RANDOM CIRCLES.

Code: Select all

REM SAMPLE CIRCLE DRAWING WITHOUT THE CIRCLE COMMAND

10 PI = 3.14159265
20 XLIMIT = 319
30 YLIMIT = 239
40 X = RND(-TI)

80 SCREEN $80
85 RECT 0,0,XLIMIT,YLIMIT,16

90 FOR K = 1 TO 100
100    CX = INT(RND(1)*XLIMIT)
110    CY = INT(RND(1)*YLIMIT)
120    CC = INT(RND(1)*255):IF CC = 0 OR CC = 16 THEN 120
130    RA = INT(RND(1)*150) + 10
140    CF = INT(RND(1) * 20) + 1
145    FILL = 0
150    IF CF > 17 AND RA < 75 THEN FILL = 1
170    GOSUB 3000
180 NEXT K

400 INPUT X$:SCREEN 0:END

REM  CX IS CIRCLE X CENTER
REM  CY IS CIRCLE Y CENTER
REM  RA IS CIRCLE RADIUS
REM  CC IS CIRCLE COLOR
REM  FI IS FILL SET TO 1 TO DRAW A FILLED CIRCLE 
REM  XL IS XLIMIT
REM  YL IS YLIMIT


3000 Q = 1 / RA
3005 FOR I = 0 TO PI / 2 STEP Q
3010    DY = SIN(I) * RA
3020    DX = COS(I) * RA
3050    ZX = INT(CX - DX)
3070    ZY = INT(CY - DY)
3090    AX = INT(CX + DX)
3110    AY = INT(CY + DY)
3120    IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT THEN 3140
3130    PSET AX, AY, CC
3140    IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT THEN 3160
3150    PSET ZX, AY, CC
3160    IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3180
3170    PSET AX, ZY, CC
3180    IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3210
3190    PSET ZX, ZY, CC
3210 NEXT I
3220 IF FILL <> 1 THEN RETURN
3230 FILL = 0 
3240 J = RA
3250 RA = RA - 1
3260 IF RA > 0 THEN GOSUB 3000
3270 IF RA > 0 THEN 3250 
3280 RA = J:FILL = 1
3290 RETURN


Re: CIRCLE IN BASIC.

Posted: Mon May 22, 2023 12:54 am
by ahenry3068
The circle code math I've never had to do... Every language I've programmed in
already had the graphics primitive for circle and ellipse.

Re: CIRCLE IN BASIC.

Posted: Thu May 25, 2023 9:40 am
by ahenry3068
Another version. FILL is much faster but does not clip at edge of screen.
Circle will still clip at EDGE of screen when only drawing the frame but
if it goes off SCREEN with FILL you get an error.

Code: Select all

REM SAMPLE CIRCLE DRAWING WITHOUT THE CIRCLE COMMAND

10 PI = 3.14159265

20 XLIMIT = 319
30 YLIMIT = 239

40 CX = 70
50 CY = 120
60 RA = 40
70 CC = 54:FILL = 1 
80 SCREEN $80
85 RECT 0,0,XLIMIT,YLIMIT,16
90 GOSUB 3000
100 INPUT X$:SCREEN 0:END

REM  CX IS CIRCLE X CENTER
REM  CY IS CIRCLE Y CENTER
REM  RA IS CIRCLE RADIUS
REM  CC IS CIRCLE COLOR
REM  FI IS FILL SET TO 1 TO DRAW A FILLED CIRCLE 
REM  XL IS XLIMIT
REM  YL IS YLIMIT


3000 Q = 1 / RA
3005 FOR I = 0 TO PI / 2 STEP Q
3010    DY = SIN(I) * RA
3020    DX = COS(I) * RA
3050    ZX = INT(CX - DX)
3070    ZY = INT(CY - DY)
3090    AX = INT(CX + DX)
3110    AY = INT(CY + DY)
3115    IF FILL = 1 THEN 3220
3120    IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT THEN 3140
3130    PSET AX, AY, CC
3140    IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT THEN 3160
3150    PSET ZX, AY, CC
3160    IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3180
3170    PSET AX, ZY, CC
3180    IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3300
3190    PSET ZX, ZY, CC
3200    GOTO 3300
3220    LINE AX,AY,CX,CY,CC
3225    LINE ZX,AY,CX,CY,CC
3230    LINE AX,ZY,CX,CY,CC
3235    LINE ZX,ZY,CX,CY,CC 
3300 NEXT I
3310 RETURN 


Squish for Oval vs Circle

Posted: Sat May 27, 2023 2:01 am
by ahenry3068
I've got it kinda figured out how to modify this for an Egg shape vs a circle.
I hope no one is hopeing for code fast enough for animation...lol
I think its fast enough for drawing static scenes.

Can do Ellipses Now

Posted: Sun May 28, 2023 7:46 am
by ahenry3068
Updated to allow ellipses. Unfilled Ellipses and Circles can clip at screen edge.
Filled Ellipses cannot. Code will throw an error.
Routine is not fast enough for any kind of animation but is ok for drawing static scenes.

Code: Select all

REM SAMPLE CIRCLE DRAWING WITHOUT THE CIRCLE COMMAND
REM  USES THE FOLLOWING VARIABLES
REM  PI IS PI :)
REM  CX IS CIRCLE X CENTER
REM  CY IS CIRCLE Y CENTER
REM  RA IS CIRCLE RADIUS
REM  CC IS CIRCLE COLOR
REM  FI IS FILL SET TO 1 TO DRAW A FILLED CIRCLE 
REM  XL IS XLIMIT
REM  YL IS YLIMIT
REM  SQUISH VARIABLES TO DRAW ELLIPSES INSTEAD OF CIRCLES
REM  YS IS XSQUISH (value between 0 and 1)
REM  XS IS XSQUISH (value between 0 and 1)
REM XSQUISH AND YSQUISH VALUES OF 0 and >= 1 are ignored
REM IF XS AND YS ARE EQUAL YOU SHOULD GET A CIRCLE ANYWAY

10 PI = 3.14159265
20 XLIMIT = 319
30 YLIMIT = 239

80 SCREEN $80
85 RECT 0,0,XLIMIT,YLIMIT,16

90 CX = 70
100 CY = 120
110 RA = 40
120 CC = 12:FILL = 0 
130 GOSUB 3000

140 CX = 200:CY = 75:RA = 50
150 CC = 10:FILL = 0:YS = .6
160 GOSUB 3000

170 CX = 200:CY = 150:RA = 60
180 CC = 14:FILL = 1:YS = 0:XS = .6
190 GOSUB 3000

2000 INPUT X$:SCREEN 0:END


3000 Q = 1 / RA
3010 IF FILL = 1 THEN Q = .25/RA
3030 FOR I = 0 TO PI / 2 STEP Q
3040    DY = SIN(I) * RA
3050    IF YS > 0 AND YS < 1 THEN DY = DY*YS
3060    DX = COS(I) * RA
3070    IF XS > 0 AND YS < 1 THEN DX = DX*XS
3080    ZX = INT(CX - DX)
3090    ZY = INT(CY - DY)
3100    AX = INT(CX + DX)
3110    AY = INT(CY + DY)
3115    IF FILL = 1 THEN 3220
3120    IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT THEN 3140
3130    PSET AX, AY, CC
3140    IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT THEN 3160
3150    PSET ZX, AY, CC
3160    IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3180
3170    PSET AX, ZY, CC
3180    IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT THEN 3300
3190    PSET ZX, ZY, CC
3200    GOTO 3300
3220    LINE CX,CY,AX,AY,CC
3225    LINE CX,CY,ZX,AY,CC
3230    LINE CX,CY,AX,ZY,CC
3235    LINE CX,CY,ZX,ZY,CC 
3300 NEXT I
3310 RETURN 


Re: CIRCLE IN BASIC.

Posted: Sun May 28, 2023 11:05 pm
by ahenry3068
Next release in HANGMAN Works in Progress is going to use this code..
Straight CUT AND PASTE I'm going to leave the line # start as 3000
for the time being, but no guarantee I won't use a customized version of
the GOSUB. I'm actually thinking of drawing the Sun in the Sky
with RAYS emanating. I could just draw the circle then brute
force the lines(rays !) with trial and error. A customized version of this
routine might be the best bet though.

Re: CIRCLE IN BASIC.

Posted: Tue May 30, 2023 3:33 am
by ahenry3068
I'm using this to good effect in my HANGMAN game.. (Works In Progress)

NEW FEATURES IN THE ROUTINE

Posted: Tue May 30, 2023 10:38 pm
by ahenry3068
Added another capability to the Subroutine. But requires some
extra initialization code. Code still works as before but
Q1, Q2, Q3 & Q4 Must be set to 1 before calling.
If any of those are set to 0 that quarter of the circle is NOT drawn.
This along with XSquish and YSquish variables and by varying RAdius
You can draw arbitrary arcs.
Quarter layout is
Q1 | Q2
Q3 | Q4

I will probably be revising this to use the MidPoint algorithm as recommended
by TomXP411 but it might take a minute before I can make that a drop in
replacement for this and I've already incorporated this into my Hangman
game code base.

I've really added features here to support my Game Drawing routines.
So I have to make a GOSUB using the Mid-Point algorithm that supports the
same features.

Code: Select all

REM SAMPLE CIRCLE DRAWING WITHOUT THE CIRCLE COMMAND
REM  USES THE FOLLOWING VARIABLES
REM  PI IS PI :)
REM  CX IS CIRCLE X CENTER
REM  CY IS CIRCLE Y CENTER
REM  RA IS CIRCLE RADIUS
REM  CC IS CIRCLE COLOR
REM  FI IS FILL SET TO 1 TO DRAW A FILLED CIRCLE 
REM  XL IS XLIMIT
REM  YL IS YLIMIT
REM  SQUISH VARIABLES TO DRAW ELLIPSES INTSTEAD OF CIRCLES
REM  YS IS XSQUISH (value between 0 and 1)
REM  XS IS XSQUISH (value between 0 and 1)
REM XSQUISH AND YSQUISH VALUES OF 0 and >= 1 are ignored
REM Q1, Q2, Q3 and Q4 if set to 0 they turn off 1/4 of the circle
REM   SET UP AS   Q1,Q2
REM               Q3,Q4
REM THE FLIP SIDE TO THAT CAPABILITY IS THAT Q1-Q4 MUST
REM BE INITIALIZED TO 1 OR THE CODE WON'T WORK. 

10 PI = 3.14159265
20 XLIMIT = 319
30 YLIMIT = 239
40 Q1 = 1
50 Q2 = 1
60 Q3 = 1
70 Q4 = 1 
80 SCREEN $80
85 RECT 0,0,XLIMIT,YLIMIT,16

90 CX = 70
100 CY = 120
110 RA = 40
120 CC = 12:FILL = 0 
130 GOSUB 3000

140 CX = 200:CY = 75:RA = 50
150 CC = 10:FILL = 0:YS = .6
160 GOSUB 3000

170 CX = 200:CY = 150:RA = 60
180 CC = 14:FILL = 1:YS = 0:XS = .4
190 Q1 = 0:GOSUB 3000

2000 INPUT X$:SCREEN 0:END


3000 Q = 1 / RA
3010 IF FILL = 1 THEN Q = .3/RA
3030 FOR I = 0 TO PI / 2 STEP Q
3040    DY = SIN(I) * RA
3050    IF YS > 0 AND YS < 1 THEN DY = DY*YS
3060    DX = COS(I) * RA
3070    IF XS > 0 AND XS < 1 THEN DX = DX*XS
3080    ZX = INT(CX - DX)
3090    ZY = INT(CY - DY)
3100    AX = INT(CX + DX)
3110    AY = INT(CY + DY)
3115    IF FILL = 1 THEN 3220
3120    IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT OR Q4 = 0 THEN 3140
3130    PSET AX, AY, CC
3140    IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT OR Q3 = 0 THEN 3160
3150    PSET ZX, AY, CC
3160    IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q2 = 0 THEN 3180
3170    PSET AX, ZY, CC
3180    IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q1 = 0 THEN 3300
3190    PSET ZX, ZY, CC
3200    GOTO 3300
3220    IF Q4<> 0 THEN LINE CX,CY,AX,AY,CC
3225    IF Q3<> 0 THEN LINE CX,CY,ZX,AY,CC
3230    IF Q2<> 0 THEN LINE CX,CY,AX,ZY,CC
3235    IF Q1<> 0 THEN LINE CX,CY,ZX,ZY,CC 
3300 NEXT I
3310 RETURN