Установка величины 2D-вектора

пытаюсь перенести что-то, что я сделал в javascript, используя библиотеку p5.js, в которой есть функция setMag для 2D-векторов

вот документация для него

Как установить величину двумерного вектора в ROBLOX/lua?

function particle:update(mouseX,mouseY)
    local t=(Vector2.new(mouseX,mouseY)-(self.pos)).unit.setMag(self.acc)
    self.thrust=t
    self.vel = self.vel + self.thrust
    if self.vel.magnitude>self.maxspeed then
          self.vel.unit.setMag(self.maxspeed)
    end
    self.pos=self.pos+(self.vel)
    self.frame.Position=UDim2.new(0,self.pos.x,0,self.pos.y)
end

person Ducktor    schedule 24.12.2016    source источник
comment
как вы можете программировать векторные вещи, если вы не знаете самых основ соответствующей математики... вы всегда будете сталкиваться с проблемами, если не понимаете, что делаете.   -  person Piglet    schedule 25.12.2016
comment
Я согласен с @piglet, этот материал требует знания как математики, так и API. Вещи, в которых вы явно не имеете разумного понимания. В своем ответе я объединяю и то, и другое вместе, о чем иначе нельзя было бы и подумать.   -  person warspyking    schedule 26.12.2016


Ответы (2)


Пусть компоненты вектора равны vx, vy. Его текущая величина

Mag = Math.Sqrt(vx * vx + vy * vy)
//as Piglet noticed in comment, you can use magnitude property

Чтобы сделать вектор с тем же направлением, но изменить величину, просто умножьте компоненты на отношение величин:

new_vx = vx * New_Mag / Mag
new_vy = vy * New_Mag / Mag
person MBo    schedule 25.12.2016
comment
Векторы Roblox предоставляют свойство величины wiki.roblox.com/index.php?title= Vector2#Magnitude_property - person Piglet; 25.12.2016
comment
Это можно упростить, см. мой ответ для более подробной информации. - person warspyking; 26.12.2016

Правильный способ установить величину вектора в roblox — просто взять единичный вектор и умножить его на длину, которую вы хотите, чтобы вектор был:

function SetMagnitude(vec, mag)
    return vec.unit*mag
end

Единичный вектор — это вектор, идентичный по направлению, но с величиной 1, поэтому это сработает :)

По сути, это упрощение того, что отмечает ответ MBo:

new_vx = vx * New_Mag / Mag
new_vy = vy * New_Mag / Mag

Поскольку, умножая вектор на число, вы умножаете все его компоненты на число:

new_v = v * New_Mag / Mag

И поскольку v.unit имеет величину 1:

new_v = v.unit * New_Mag / 1

И любое число, деленное на 1, есть само:

new_v = v.unit * New_Mag

Таким образом, вы можете рассматривать то, что я назвал "правильным способом", не просто альтернативным способом, но более эффективным и чистым решением.

person warspyking    schedule 25.12.2016