A little Math

I am trying to get a bunch of objects to interact with eachother in such a way that a collection of objects will be repelled from a user controlled object. each individual object should be repelled along the slope between itself and the user object, using the objects centers to determine the slope. The speed at which the object is repelled should be a constant, regardless of the slope.

each object has
float xspeed
float yspeed
float addedxspeed
float addedyspeed

xspeed and yspeed are constant for the lifetime of an object but the added speeds can be changed and are acted upon by a friction constant.
the coordinate plane that I am working with starts with x=0 growing left to right and y=0 growing top to bottom.
I would like to know how to calculate what my addedspeeds should be in order to make the object travel away from the user at a set speed, lets say 3.

if it helps at all to know my objects represent fish and the user is trying to eat them, the fish get scared, and swim away from the user…
Thanks for your help, if any more information is needed I will gladly repost…

The process of trying to explain the problem I was having seems to have helped me work through it…

float distance = (float)Math.sqrt(Math.pow(userFish.x - fish2.x, 2) + Math.pow(userFish.y - fish2.y, 2));

float diffX = userFish.x - fish2.x;
diffX = diffX * (3/distance);

float diffY = userFish.y - fish2.y;
diffY = diffY * (3/distance);

fish2.addedVelocityX = diffX;
fish2.addedVelocityY = diffY;

I believe this solved my problem…

You really need to sort out your variable naming. Change in velocity is called acceleration, you know…

If you think this is bad you should see the code from when I started, for some odd reason when I am writing code variable names just don’t come to me. but it is all in the works, getting better every day…

Ah, I see what you’re doing now. Don’t use pow(x, 2), it is dead slow. Instead calculate diffX = (x1 - x2) and diffY = (y1 - y2) before the distance calculation, and manually square them by writing diffXdiffX + diffYdiffY. You can also then reuse this value later.


float dx = userFish.x - fish2.x;
float dy = userFish.y - fish2.y;
float distance = (float)Math.sqrt(dx*dx + dy*dy);
fish2.addedVelocityX = dx * 3 / distance;
fish2.addedVelocityY = dy * 3 / distance;

This code does the exact same thing and is a looooot faster.

This is non-relevant to the original question, but one good way to write good variable names is to use mathematical names for them.

pointX / posX //Point is a point in the coordinate grid, therefore a coordinate.
pointY / posY

velX //velocity is from what i have understood the same thing as speed
velY

accX //acceleration is change in velocity if i remember correctly
accY

That’s my way of naming my variables :slight_smile:

Mine more simple

position: X, Y
Velocity: dX, dY
Acceleration: dDY, dDX

;D

btw, why use float instead double?

Floats are a force of habit for OpenGL programmers, because that’s all most any GPU handles. Modern cards do doubles but often much slower.

And do you really need that good precision? I mean, for a physics simulation that will run for a long time or that just needs to be precise, sure, but for graphics?