03-12-2004, 06:45 AM
This started with the inquiries of whitetiger.
Code:
xmax% = 3200
ymax% = 2000
DIM particleAmount AS INTEGER, particleAmount2 AS INTEGER
DIM blackHoleAmount AS INTEGER, blackHoleAmount2 AS INTEGER
DIM teleportOn AS INTEGER
teleportOn = 1
particleAmount = 200
particleAmount2 = particleAmount - 1
blackHoleAmount = 15
blackHoleAmount2 = blackHoleAmount - 1
CONST spaceconst1 = 1000
DIM SHARED particleVX(particleAmount2) AS LONG
DIM SHARED particleVY(particleAmount2) AS LONG
DIM SHARED particleX(particleAmount2) AS INTEGER
DIM SHARED particleY(particleAmount2) AS INTEGER
DIM SHARED particleColor(particleAmount2) AS INTEGER
DIM blackHoleX(blackHoleAmount2) AS INTEGER
DIM blackHoleY(blackHoleAmount2) AS INTEGER
IF teleportOn THEN
DIM blackHoleTargetX(blackHoleAmount2) AS INTEGER
DIM blackHoleTargetY(blackHoleAmount2) AS INTEGER
END IF
DIM blackHoleGravity(blackHoleAmount2) AS INTEGER
'RANDOMIZE TIMER
FOR i% = 0 TO particleAmount2
particleX(i%) = RND * xmax%
particleY(i%) = RND * ymax%
particleVX(i%) = RND * 5 - 2
particleVY(i%) = RND * 5 - 2
particleColor(i%) = RND * 16
NEXT i%
FOR i% = 0 TO blackHoleAmount2
blackHoleGravity(i%) = RND * 8 + 8
blackHoleX(i%) = RND * xmax%
blackHoleY(i%) = RND * ymax%
redo1:
IF teleportOn THEN
blackHoleTargetX(i%) = RND * xmax%
blackHoleTargetY(i%) = RND * ymax%
IF blackHoleX(i%) = blackHoleTargetX(i%) THEN IF blackHoleY(i%) = blackHoleTargetY(i%) THEN GOTO redo1
END IF
NEXT i%
SCREEN 7, , 0, 1
DO
FOR i% = 0 TO particleAmount2
'calculate gravitational effects
px% = particleX(i%): py% = particleY(i%)
pvx& = particleVX(i%) * 10000: pvy& = particleVY(i%) * 10000
pvxconst& = pvx&: pvyconst& = pvy&
FOR j% = 0 TO blackHoleAmount2
bx% = blackHoleX(j%)
by% = blackHoleY(j%)
bg% = blackHoleGravity(j%)
xpart& = px% - bx%
ypart& = py% - by%
IF px% - bx% < xmax% - px% + bx% THEN
IF py% - by% < ymax% - py% + by% THEN
distance& = (px% - bx%) ^ 2 + (py% - by%) ^ 2
ELSE
distance& = (px% - bx%) ^ 2 + (ymax% - py% - by%) ^ 2
END IF
ELSE
IF py% - by% < ymax% - py% + by% THEN
distance& = (xmax% - px% + bx%) ^ 2 + (py% - by%) ^ 2
ELSE
distance& = (xmax% - px% + bx%) ^ 2 + (ymax% - py% - by%) ^ 2
END IF
END IF
distance& = distance& / bg%
IF distance& THEN
xpart& = xpart& / SQR(distance&)
ypart& = ypart& / SQR(distance&)
IF xpart& THEN
temp& = ((xpart& + ypart&) / xpart&): pvx& = pvx& + temp&
END IF
IF ypart& THEN
temp& = ((xpart& + ypart&) / ypart&): pvy& = pvy& + temp&
END IF
END IF
NEXT j%
'calculate new sum velocity
particleVX(i%) = pvx& \ 10000
particleVY(i%) = pvy& \ 10000
'calculate new position
particleX(i%) = (px% + pvx&) MOD xmax%
particleY(i%) = (py% + pvy&) MOD ymax%
IF particleX(i%) < 0 THEN particleX(i%) = particleX(i%) + xmax%
IF particleY(i%) < 0 THEN particleY(i%) = particleY(i%) + ymax%
'teleport
IF teleportOn THEN
FOR j% = 0 TO blackHoleAmount2
IF particleX(i%) = blackHoleX(j%) THEN
IF particleY(i%) = blackHoleY(j%) THEN
particleX(i%) = blackHoleTargetX(j%)
particleY(i%) = blackHoleTargetY(j%)
EXIT FOR
END IF
END IF
NEXT j%
END IF
'draw it
PSET (particleX(i%) / xmax% * 320, particleY(i%) / ymax% * 200), particleColor(i%)
NEXT i%
FOR j% = 0 TO blackHoleAmount2
CIRCLE (blackHoleX(j%) / xmax% * 320, blackHoleY(j%) / ymax% * 200), SQR(blackHoleGravity(j%)) * 1000 / spaceconst1, 15
NEXT j%
PCOPY 0, 1: CLS
SELECT CASE INKEY$
CASE IS <> "": EXIT DO
END SELECT
LOOP
Peace cannot be obtained without war. Why? If there is already peace, it is unnecessary for war. If there is no peace, there is already war."
Visit www.neobasic.net to see rubbish in all its finest.
Visit www.neobasic.net to see rubbish in all its finest.