Need some math help

Blitz3D Forums/Blitz3D Programming/Need some math help

Jack(Posted 2005) [#1]
I should be able to do this but I just can't get it together.

Lets say I have a movement allowance of 30 points.

For each 4 points I move in the Z diraction I will move 1 point in the X direction.Ok - so I can get the angle from the starting point.

But - how do I figure where I end up on the Z axis and where will I end up on the x axis.Must be an easy formula for this.

Appreciate any help.


BlackJumper(Posted 2005) [#2]
You have a 'radius' of 30 units and an angle a where Tan a = 1/4


z = 30 * Cos(1/4) ; generally z = radius * Cos(angle)
x = 30 * Sin (1/4) ; generally x = radius * Sin(angle)

{unless I have my axes swapped :-P }

I assume you should be using TranslateEntity with these z and x values each turn, as MoveEntity would depend on which way you are facing and PositionEntity would always place it 30 units from the origin... not updating each turn


Jack(Posted 2005) [#3]
Thanks Blackjumper but I don't want to actually move the item.That I can do okay.

I just want to know where it would finish if I did move it.

There are to many items move to sctually move to find out where the end point would be.

Hope this makes sense.


Floyd(Posted 2005) [#4]
For each total movement of 5 (i.e. 4+1 ) the Z direction gets 4 and X gets 1.

So Z gets 4/5 of the total and X gets 1/5.


DH(Posted 2005) [#5]
Find the vector
easy: (4,1)
Find the magnitude of that vector
M = Sqr(x*x)+(z*z)
M = 4.47213
Divide the vector by the magnitude
X = 4 / M
Z = 1 / M
X = 0.89442
Z = 0.22360
The normalized vector is (.89442,.22360)

So now say you want to move a total of 30 spaces in this direction? Simply use 30 as the magnitude and multiply by the normalized vector.
NewX = NX * M = .89442 * 30
NewZ = NZ * M = .22360 * 30
your new position will be:(26.8326,6.708)

And walla!

Now if you want to move based on an angle, then you must convert the angle into a vector:
Take your angle above (which is 26.5650 degrees)
NVX = cos(A)
NVZ = Sin(A)

This will give you a normalized vector based on the angle (the same vector you have above). To move 30 spaces, use it as the magnitude in the formula above.

So, if I am cathing your drift here, you want to move 30 spaces in an artibrary direction?

What direction, is it an angle? if so, then plug your angle in as A and your 30 spaces in as M into the following for your new position:
NewX = Cos(A) * M
NewZ = Sin(A) * M

Want to know the angle of movement you just went? Then plug in your X and Z values in below (IE you moved X units accross and Z units forward):
M = Sqr(x*x)+(z*z)
Angle = ACos(X/M)

And there you have the angle by which you moved.

Am I off base here?


Floyd(Posted 2005) [#6]
Yeah, I read the question as taking 30 steps, some in the x direction and some the z direction.

But I think the real question was how to move 30 units in a particular direction, indicated by x changing 4 for each change of 1 in z.

For that I would consider what happens when x changes by 4 and z by 1. The distance traveled is then Sqr( 4*4 + 1*1 ) = Sqr(17).

For each unit of distance the change in x is 4/Sqr(17) and the change in z is 1/Sqr(17).
To get an arbitrary amount of travel, such as 30, just multiply these by the distance.
Graphics 550, 250, 0, 2

x# = 4
z# = 1

dist# = Sqr( x*x + z*z )

dx# = x/dist
dz# = z/dist

; For each unit of distance the x and z step sizes are dx and dz.

; Example, to travel 30 units the x and z changes are

travel# = 30

xStep# = travel * dx
zStep# = travel * dz

Print
Print "To travel while maintaining x,z in a ratio of 4 to 1 we move"
Print dx + " in the x direction and " + dz + " in the z direction"
Print "for each unit of distance."
Print
Print "So to move " + travel + " units we go " + xStep + " in x and " + zStep + " in z."

WaitKey : End



WolRon(Posted 2005) [#7]
And walla!
Isn't that Voila! ?


DH(Posted 2005) [#8]
Isn't that Voila! ?


If I had a Germen accent I suppose it would be.


Jack(Posted 2005) [#9]
Thanks much guys - just the formula I needed.