quick question. I'm basically working on a program where we have an Entity cross across a grid. Every time it finishes a "step" (ie, goes from (0, 0) to (1, 0)), I need to fire off an event. The entity's movement per frame is calculated by:
frameMovement = entitySpeed * (frameDeltaMs / 1000)
and then added onto the entity's X co-ordinate. I elected to use world units (1 world unit is 16 pixels) instead of raw pixels for the co-ordinate system simply for separation of concern. The world does not need to know that the distance for one square is 16 pixels - only the drawing system does.
So basically, I'm trying to work out how to tell the system that the unit has finished a "step". Obviously, due to the way the frame movement is calculated, you will never be exactly on a new square, so I must "clip" the unit to that square or have a method that will return "true" if we are within a certain distance from the square (which right now I have decided to be 0.05wu - about 0.8 pixels from the square).
The function I have so far is this:
return Math.floor(x) % x == 0;
I'm only using X seeing as I'm just trying to get it working at the moment. However the problem I have is that this function seems to return one of two results:
x = 0f;
System.out.println(Math.floor(x) % x);
> NaN
This is to be expected, as 0 % 0 is indeed NaN. I can work around this no problem. However the issue I have at the moment is the other result..
x = 1f; // Or any number with 1sd > 0
System.out.println(Math.floor(x) % x);
> 1f
That is, the other result always returns the value of X, rather than the correct modulo (which, if math.floor(x) and x are equal - ie x is equal to 1f), which should be 0.
I'm not entirely sure what is causing this. If you have any answers for me or any suggestions on how I can fix this in a better way, I'm all ears.
TL;DR: I need to figure out when an Entity moves from one co-ordinate to the next. The co-ordinates (and the Entity's transition across them) are stored as a float. If an Entity is halfway across traversing a square, the Entity's X co-ordinate is stored as 1.5, for example. Finally, Floor(1.0) % 1.0 is returning 1.0, and not 0.
EDIT:
In my code I have this
System.out.println("x equals " + x + ". Math.floor(x)%x==Math.floor(x): "+(Math.floor(x)%x==Math.floor(x)));
With output http://pastebin.com/egDwj7Gs
EDIT 2: Images are fun!
http://prntscr.com/1j193n
The white square is the entity. The red square is simply a drawn-on grid. Each square is 16 by 16.
As you can see, right now the white square is at (6.5, 0). I need the program to basically recognise when it passes (7, 0).
EDIT: Lee and I had a chat, here's our chat: https://chat.stackoverflow.com/rooms/34727/discussion-between-neglected-and-lee-meador
He solved the problem for me so I have accepted his answer as correct.
float after = pos.x+changeInPosition;
if (Math.floor(after) != Math.floor(pos.x)) {
// We passed a boundary
}
pos.x = after;
Modulo means we divide and take the remainder (just like in 3rd grade for me).
So ...
10 % 9 is 1.
And
10 % 10 is 0
And
10.5 % 10.5 is 0.
(Perhaps you could get rounding issues if you had x = ...calculate 10.5.. and then x % x where you would get a number just below 10.5 or just larger than 0.)
So, for all integers,
Floor(x) % x is 0.
For a non-integer, it works differently.
Floor(10.5) => 10
and
10 % 10.5 is 10.
So barring the effect of rounding errors in the floating point, Floor(x) % x is either 0 (for integers) or Floor(x) for non-integers.
More
Perhaps you could tell if it passed a grid line by comparing the before and after positions:
if (Math.Floor(xAfterMoving / gridSize) != Math.floor(xBeforeMoving / gridSize)) {
fireXGridCrossingEvent();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With