# Moving units by vectors

#### wraithseeker

##### Tired.
So I have vector a which is x y z of initial unit position available and vector b x y z of final unit position available, how do I move them?
JASS:
``````// initial vector
set d.zx = GetUnitX(target) * Cos(angle)
set d.zy = GetUnitY(target) * Sin(angle)
call MoveLocation(L,d.x,d.y)
set d.zz = GetLocationZ(L) // I am not using Z axis for now, ignore it same for the rest``````

JASS:
``````// speed vector

set d.x = speed * Cos(angle) * TIME
set d.y = speed * Sin(angle) * TIME
set d.z = 0 * TIME``````

JASS:
``````//decrement vector

set d.dx = decrement * Cos(angle) * TIME
set d.dy = decrement * Sin(angle) * TIME
set d.z = 0 * TIME``````

I am new to vectors so don't blame me for doing stupid stuff, this is deacclerating and not accelerating. They start from a variable of x speed and then x decrement and end at 0 speed.

#### phyrex1an

##### Staff Member and irregular helper
Staff member
Current position: P
Speed: V
Acceleration (use negative signs for deacceleration...): A
V and A are already in the right unit of time (this is what you do when you have *TIME)

Each interval:
V = V+A ([de]accelerating)
P = P+V (updating unit position)

Typically the movement would end when |V|<=0 ("length of V is less than 0")
Adding two vectors together is the the same thing as adding their respective x, y and z values.

#### wraithseeker

##### Tired.
EDIT: Typically the movement would end when |V|<=0 ("length of V is less than 0")

Doesn't work.

#### wraithseeker

##### Tired.
JASS:
``````  call MoveLocation(L,x,y)
set d.position = vector.create(x,y,GetUnitFlyHeight(target)-GetLocationZ(L))
set d.velocity = vector.create(x-GetUnitX(source),y- GetUnitY(source),120) // what should I input for the z axis of velocity?
call d.velocity.setLength(speed*TIME)
set d.acceleration = vector.create(d.velocity.x*-1,d.velocity.y*-1,GRAVITY) // GRAVITY = -981
call d.acceleration.setLength(decrement*TIME)

// periodic function
set d.velocity.x = d.velocity.x+d.acceleration.x
set d.velocity.y = d.velocity.y + d.acceleration.y // I know I could have added them together but I am doing some testing
set d.velocity.z = d.velocity.z + d.acceleration.z
set d.position.x = d.position.x + d.velocity.x
set d.position.y = d.position.y + d.velocity.y
call MoveLocation(L,d.position.x,d.position.y)
set d.position.z = d.position.z + d.velocity.z
set Height = GetLocationZ(L)
call SetUnitX(d.target,d.position.x)
call SetUnitY(d.target,d.position.y)
call SetUnitFlyHeight(d.target,d.position.z-Height,0)``````

The jump doesn't function correctly, it stops earlier then it should have been and it normally doesn't come down.

#### phyrex1an

##### Staff Member and irregular helper
Staff member
Since this is a jump the movement should stop when d.position.z-Height <= 0. (set the fly height to 0 when this happens)
A jump won't have a x and y deacceleration, unless you account for air resistance which seems very unneeded for a wc3 spell. The only force is the gravity (z).

#### wraithseeker

##### Tired.
A stop condition is when the dot product of velocity and acceleration vector >= 0 then destroy the struct.

Well but that will screw up my distance as the distance gets longer for that condition. The x and y deacceleration is the knockback deacceleration.