How about some vector noodles? - TerryRitchie - 05-13-2024
Just noodling around today with vectors. Came up with this little interesting toy.
Code: (Select All) 'Vector noodling
' Move mouse to attract particles
' Press left mouse button to repel particles
CONST PARTICLES = 250000 ' maximum number of particles
CONST SWIDTH = 960 ' screen width
CONST SHEIGHT = 540 ' screen height
CONST MASS = 25 ' mass of particles
TYPE PARTICLE ' PARTICLE PROPERTIES
x AS SINGLE ' y location
y AS SINGLE ' x location
xv AS SINGLE ' y vector
yv AS SINGLE ' x vector
END TYPE
DIM Particle(PARTICLES - 1) AS PARTICLE ' create particles
DIM p AS LONG ' particle counter
DIM d AS SINGLE ' distance between particle and mouse
DIM xv AS SINGLE ' x vector from particle to mouse
DIM yv AS SINGLE ' y vector from particle to mouse
DIM Circ AS LONG ' picture of a solid circle
Circ = _NEWIMAGE(11, 11, 32) ' picture canvas
_DEST Circ ' craw circle
CIRCLE (5, 5), 5
PAINT (5, 5)
RANDOMIZE TIMER
DO ' randomize particles
Particle(p).x = RND * SWIDTH
Particle(p).y = RND * SHEIGHT
Particle(p).xv = RND - RND
Particle(p).yv = RND - RND
p = p + 1
LOOP UNTIL p = PARTICLES
SCREEN _NEWIMAGE(SWIDTH, SHEIGHT, 32) ' start the madness
_MOUSEHIDE
DO
CLS
_LIMIT 120
p = 0
DO
PSET (Particle(p).x, Particle(p).y) ' draw particle
WHILE _MOUSEINPUT: WEND
d = _HYPOT(_MOUSEX - Particle(p).x, _MOUSEY - Particle(p).y) ' distance to mouse
xv = (_MOUSEX - Particle(p).x) / d ' x vector to mouse
yv = (_MOUSEY - Particle(p).y) / d ' y vector to mouse
IF _MOUSEBUTTON(1) THEN ' left mouse button?
Particle(p).xv = (Particle(p).xv - xv) / d * MASS ' yes, repel
Particle(p).yv = (Particle(p).yv - yv) / d * MASS
ELSE ' no
Particle(p).xv = (Particle(p).xv + xv) / d * MASS ' attract
Particle(p).yv = (Particle(p).yv + yv) / d * MASS
END IF
Particle(p).x = Particle(p).x + Particle(p).xv ' add vector velocity to x
Particle(p).y = Particle(p).y + Particle(p).yv ' add vector velocity to y
IF Particle(p).x < 0 THEN ' keep particles on screen
Particle(p).x = 0
ELSEIF Particle(p).x > SWIDTH - 1 THEN
Particle(p).x = SWIDTH - 1
END IF
IF Particle(p).y < 0 THEN
Particle(p).y = 0
ELSEIF Particle(p).y > SHEIGHT - 1 THEN
Particle(p).y = SHEIGHT - 1
END IF
p = p + 1
LOOP UNTIL p = PARTICLES
_PUTIMAGE (_MOUSEX - 5, _MOUSEY - 5), Circ
_DISPLAY
LOOP UNTIL _KEYDOWN(27)
SYSTEM
RE: How about some vector noodles? - bplus - 05-13-2024
+1 this is almost like boids with so little code, very interesting thanks
RE: How about some vector noodles? - TerryRitchie - 05-13-2024
(05-13-2024, 04:43 PM)bplus Wrote: +1 this is almost like boids with so little code, very interesting thanks I'm playing around with more example snippets for the tutorial and stumbled on this. After I caught myself toying with it mindlessly for a few minutes I thought others might like to do the same.
RE: How about some vector noodles? - Sprezzo - 05-13-2024
-----
RE: How about some vector noodles? - TerryRitchie - 05-13-2024
(05-13-2024, 05:42 PM)Sprezzo Wrote: Hey Terry,
Looks great, however I need to fix something I noticed years ago in your terminology.
You're mixing "vector" with "velocity". Reduced example being:
Code: (Select All) TYPE PARTICLE ' PARTICLE PROPERTIES
x AS SINGLE ' y location
y AS SINGLE ' x location
xv AS SINGLE ' y vector
yv AS SINGLE ' x vector
END TYPE
In the above, the information (x,y) is the position vector, and (xv, yv) is the velocity vector. Both are ordered pairs in the plane, both are vectors.
So that's point #1, point #2 has to to with units. For instance:
Code: (Select All) Particle(p).x = Particle(p).x + Particle(p).xv
Particle(p).y = Particle(p).y + Particle(p).yv
Here, it looks like you're adding the velocity vector to the position vector. This is technically a mistake, because you're adding distance units to distance/time units. I can't add 7 miles to 3.5 miles per hour, there's a unit mismatch. To make that read more properly, you want:
Code: (Select All) Particle(p).x = Particle(p).x + Particle(p).xv * TIMESTEP
Particle(p).y = Particle(p).y + Particle(p).yv * TIMESTEP
Then, let velocity be a reasonable number, and then let TIMESTEP be a very small increment in time. Right now you've got an implied timestep of 1 and tiny velocity per particle. No problem for this demo, but in general doing it that way can be... not really representative of motion at worst.
Aaaaanyway, take it all or leave it all. Your qb64 tutorial is already the best prose on QB64 ever written, I just wanna see it that much closer to perfect. @Sprezzo
I'm completely self taught when it comes to math and I'm sure, as you pointed out, my terminology is suspect. I really do appreciate when people correct me on these matters. Since you are better versed on this could you do me a huge favor?
- Correct the above code to how it should look/perform.
- When you find time look over Lesson 17 and let me know what I need to change in there.
- Write me a quick tutorial on the proper use and terminology of vector math.
I'm constantly getting terminology mixed up and a tutorial on the subject I can refer back to would be a huge benefit and help me to correct Lesson 17 issues where they occur. My goal is to make the tutorial 100% accurate but I'm lacking in certain areas and help from others is greatly appreciated.
RE: How about some vector noodles? - GareBear - 05-13-2024
(05-13-2024, 03:30 PM)TerryRitchie Wrote: Just noodling around today with vectors. Came up with this little interesting toy.
Code: (Select All) 'Vector noodling
' Move mouse to attract particles
' Press left mouse button to repel particles
CONST PARTICLES = 250000 ' maximum number of particles
CONST SWIDTH = 960 ' screen width
CONST SHEIGHT = 540 ' screen height
CONST MASS = 25 ' mass of particles
TYPE PARTICLE ' PARTICLE PROPERTIES
x AS SINGLE ' y location
y AS SINGLE ' x location
xv AS SINGLE ' y vector
yv AS SINGLE ' x vector
END TYPE
DIM Particle(PARTICLES - 1) AS PARTICLE ' create particles
DIM p AS LONG ' particle counter
DIM d AS SINGLE ' distance between particle and mouse
DIM xv AS SINGLE ' x vector from particle to mouse
DIM yv AS SINGLE ' y vector from particle to mouse
DIM Circ AS LONG ' picture of a solid circle
Circ = _NEWIMAGE(11, 11, 32) ' picture canvas
_DEST Circ ' craw circle
CIRCLE (5, 5), 5
PAINT (5, 5)
RANDOMIZE TIMER
DO ' randomize particles
Particle(p).x = RND * SWIDTH
Particle(p).y = RND * SHEIGHT
Particle(p).xv = RND - RND
Particle(p).yv = RND - RND
p = p + 1
LOOP UNTIL p = PARTICLES
SCREEN _NEWIMAGE(SWIDTH, SHEIGHT, 32) ' start the madness
_MOUSEHIDE
DO
CLS
_LIMIT 120
p = 0
DO
PSET (Particle(p).x, Particle(p).y) ' draw particle
WHILE _MOUSEINPUT: WEND
d = _HYPOT(_MOUSEX - Particle(p).x, _MOUSEY - Particle(p).y) ' distance to mouse
xv = (_MOUSEX - Particle(p).x) / d ' x vector to mouse
yv = (_MOUSEY - Particle(p).y) / d ' y vector to mouse
IF _MOUSEBUTTON(1) THEN ' left mouse button?
Particle(p).xv = (Particle(p).xv - xv) / d * MASS ' yes, repel
Particle(p).yv = (Particle(p).yv - yv) / d * MASS
ELSE ' no
Particle(p).xv = (Particle(p).xv + xv) / d * MASS ' attract
Particle(p).yv = (Particle(p).yv + yv) / d * MASS
END IF
Particle(p).x = Particle(p).x + Particle(p).xv ' add vector velocity to x
Particle(p).y = Particle(p).y + Particle(p).yv ' add vector velocity to y
IF Particle(p).x < 0 THEN ' keep particles on screen
Particle(p).x = 0
ELSEIF Particle(p).x > SWIDTH - 1 THEN
Particle(p).x = SWIDTH - 1
END IF
IF Particle(p).y < 0 THEN
Particle(p).y = 0
ELSEIF Particle(p).y > SHEIGHT - 1 THEN
Particle(p).y = SHEIGHT - 1
END IF
p = p + 1
LOOP UNTIL p = PARTICLES
_PUTIMAGE (_MOUSEX - 5, _MOUSEY - 5), Circ
_DISPLAY
LOOP UNTIL _KEYDOWN(27)
SYSTEM
This is like Lay's chips. Hard to stop.
RE: How about some vector noodles? - bplus - 05-13-2024
ha sprezzo made me look
Code: (Select All) TYPE PARTICLE ' PARTICLE PROPERTIES
x AS SINGLE ' y location
y AS SINGLE ' x location
'xv AS SINGLE ' y vector ????
dx as single ' the change over the x-axis of particle position
'yv AS SINGLE ' x vector ????
dy as single ' the change over the y-axis of the particle position
END TYPE
dx, dy are vector components sped up or slowed down by so called mass, just a scalar multiplier.
RE: How about some vector noodles? - NakedApe - 05-14-2024
Very cool, Terry. Fun to play with.
RE: How about some vector noodles? - Sprezzo - 05-14-2024
-----
RE: How about some vector noodles? - bplus - 05-14-2024
imho 'vector' is an over complication of the location of a simple point on a plane, not really basic is it?
@TerryRitchie why are you swapping x, y in this definition comments?, it's not how you use it in your code. are those typos in the comments?
Code: (Select All) TYPE PARTICLE ' PARTICLE PROPERTIES
x AS SINGLE ' y location
y AS SINGLE ' x location
xv AS SINGLE ' y vector
yv AS SINGLE ' x vector
END TYPE
|