'Rain Drain.bas started 2017-09-13
'translated from
'Rain Drain.bas SmallBASIC 0.12.9 [B+=MGA] 2017-04-26
' 2020-08-29 Rain Drain 2: What if we move one side of every line up and down?
_TITLE "Rain Drain 2: spacebar for new arrangement, esc to quit"
balls = 1500
b(i).speed = 9.85
b(i).r = 6
b
(i
).c
= _RGB(0, rand%
(200, 255), rand%
(200, 255))
m = 10
nbl = 12
d = rand%(50, 200)
bl(i).x1 = rand%(m, xmax - d - m)
bl(i).y1 = i * ymax / nbl - 10
bl
(i
).x2
= bl
(i
).x1
+ d
* COS(bl
(i
).a
) bl
(i
).y2
= bl
(i
).y1
+ d
* SIN(bl
(i
).a
) dir = .5: lp = 0
lp = lp + dir
IF b
(j
).y
- b
(j
).r
> ymax
OR b
(j
).x
+ b
(j
).r
< 0 OR b
(j
).x
- b
(j
).r
> xmax
THEN b(j).x = rand%(0, xmax): b(j).y = 0
fcirc b(j).x, b(j).y, b(j).r, b(j).c
testx
= b
(j
).x
+ b
(j
).speed
* COS(_PI(.5)) testy
= b
(j
).y
+ b
(j
).speed
* SIN(_PI(.5)) cFlag = 0
IF j
= 1 THEN bl
(i
).y1
= bl
(i
).y1
+ dir
LINE (bl
(i
).x1
, bl
(i
).y1
)-(bl
(i
).x2
, bl
(i
).y2
) IF hitLine
(testx
, testy
, b
(j
).r
, bl
(i
).x1
, bl
(i
).y1
, bl
(i
).x2
, bl
(i
).y2
) THEN bx1
= b
(j
).x
+ b
(j
).speed
* COS(bl
(i
).a
) bx2
= b
(j
).x
+ b
(j
).speed
* COS(_PI(1) - bl
(i
).a
) by1 = yy(bx1, bl(i).x1, bl(i).y1, bl(i).x2, bl(i).y2) - b(j).r - 1
by2 = yy(bx2, bl(i).x1, bl(i).y1, bl(i).x2, bl(i).y2) - b(j).r - 1
IF by1
= (-9999 - b
(j
).r
- 1) OR by2
= (-9999 - b
(j
).r
- 1) THEN IF by1
>= by2
THEN b
(j
).y
= by1: b
(j
).x
= bx1
ELSE b
(j
).y
= by2: b
(j
).x
= bx2
cFlag = 1
IF cFlag
= 0 THEN b
(j
).x
= testx: b
(j
).y
= testy
FUNCTION hitLine
(x
, y
, r
, xx1
, yy1
, xx2
, yy2
) x1 = xx1: y1 = yy1: x2 = xx2: y2 = yy2
IF ((y2
- y1
) / (x2
- x1
)) * (x
- x1
) + y1
- r
< y
AND y
< ((y2
- y1
) / (x2
- x1
)) * (x
- x1
) + y1
+ r
THEN hitLine = 1
hitLine = 0
FUNCTION yy
(x
, xx1
, yy1
, xx2
, yy2
) 'this puts drop on line 'copy parameters that are changed
x1 = xx1: y1 = yy1: x2 = xx2: y2 = yy2
yy = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1
yy = -9999
rand%
= (RND * (hi%
- lo%
+ 1)) \
1 + lo%
Radius
= ABS(R
): RadiusError
= -Radius: X
= Radius: Y
= 0 LINE (CX
- X
, CY
)-(CX
+ X
, CY
), C
, BF
RadiusError = RadiusError + Y * 2 + 1
LINE (CX
- Y
, CY
- X
)-(CX
+ Y
, CY
- X
), C
, BF
LINE (CX
- Y
, CY
+ X
)-(CX
+ Y
, CY
+ X
), C
, BF
X = X - 1
RadiusError = RadiusError - X * 2
Y = Y + 1
LINE (CX
- X
, CY
- Y
)-(CX
+ X
, CY
- Y
), C
, BF
LINE (CX
- X
, CY
+ Y
)-(CX
+ X
, CY
+ Y
), C
, BF