_TITLE "Circle Filled by Steve mod B+" '2019-02-06
LINE (0, 0)-(800, 600), black
, BF
LINE (200, 200)-(400, 400), &HFFFFFFFF, B
PaintWithBalls
300, 300, 10, _RGB32(255, 128, 0)INPUT "To see a show, press enter, and other + enter ends program... "; wate$
LINE (0, 0)-(800, 600), &HFF000000, BF
PaintWithBalls
200, 200, INT(RND * 45 + 5), _RGB32(255, 100, 0)
br = 2 * ballRadius + 1
IF circClear
(X
, Y
, ballRadius
) THEN ball X, Y, ballRadius, ballColr
PaintWithBalls X
+ br
* COS(0), Y
+ br
* SIN(0), ballRadius
, ballColr
PaintWithBalls X
+ br
* COS(ra
), Y
+ br
* SIN(ra
), ballRadius
, ballColr
PaintWithBalls X
+ br
* COS(ra
* 2), Y
+ br
* SIN(ra
* 2), ballRadius
, ballColr
PaintWithBalls X
+ br
* COS(ra
* 3), Y
+ br
* SIN(ra
* 3), ballRadius
, ballColr
PaintWithBalls X
+ br
* COS(ra
* 4), Y
+ br
* SIN(ra
* 4), ballRadius
, ballColr
PaintWithBalls X
+ br
* COS(ra
* 5), Y
+ br
* SIN(ra
* 5), ballRadius
, ballColr
'Steve McNeil's copied from his forum note: Radius is too common a name
RadiusError = -subRadius
X = subRadius
Y = 0
'IF subRadius = 0 THEN PSET (CX, CY): EXIT SUB
' Draw the middle span here so we don't draw it twice in the main loop,
' which would be a problem with blending turned on.
RadiusError = RadiusError + Y * 2 + 1
'LINE (CX - Y, CY - X)-(CX + Y, CY - X), , BF
'LINE (CX - Y, CY + X)-(CX + Y, CY + X), , BF
X = X - 1
RadiusError = RadiusError - X * 2
Y = Y + 1
'LINE (CX - X, CY - Y)-(CX + X, CY - Y), , BF
'LINE (CX - X, CY + Y)-(CX + X, CY + Y), , BF
circClear = -1
kr
= _RGB32((r
- rad
) / r
* rd
, (r
- rad
) / r
* g
, (r
- rad
) / r
* b
) fel x, y, rad, rad, kr
'FillEllipse is too much typing so aballRadiuseviated to fel
' with Steve's EllipseFill, who needs CircleFill? fix for 0 radii 2019-02-05
' Is this fast enough for general circle fill (June 2018): https://www.qb64.org/forum/index.php?topic=298.msg1942#msg1942
' EllipseFill SMcNeill (Nov 3, 2018) https://www.qb64.org/forum/index.php?topic=755.msg6506#msg6506
a = 2 * rx * rx
b = 2 * ry * ry
x = rx
xx = ry * ry * (1 - rx - rx)
yy = rx * rx
sx = b * rx
LINE (cx
- x
, cy
- y
)-(cx
+ x
, cy
- y
), c
, BF
IF y
<> 0 THEN LINE (cx
- x
, cy
+ y
)-(cx
+ x
, cy
+ y
), c
, BF
y = y + 1
sy = sy + a
e = e + yy
yy = yy + a
x = x - 1
sx = sx - b
e = e + xx
xx = xx + b
x = 0
y = ry
xx = rx * ry
yy = rx * rx * (1 - ry - ry)
e = 0
sx = 0
sy = a * ry
LINE (cx
- x
, cy
- y
)-(cx
+ x
, cy
- y
), c
, BF
LINE (cx
- x
, cy
+ y
)-(cx
+ x
, cy
+ y
), c
, BF
x = x + 1
sx = sx + b
e = e + xx
xx = xx + b
y = y - 1
sy = sy - a
e = e + yy
yy = yy + a
rand%
= INT(RND * (hi%
- lo%
+ 1)) + lo%