Math 设置二维向量的幅值

Math 设置二维向量的幅值,math,vector,lua,roblox,magnitude,Math,Vector,Lua,Roblox,Magnitude,尝试使用p5.js库移植我在javascript中制作的东西,该库具有用于2D向量的setMag函数 这是我的建议 如何设置ROBLOX/lua中2D向量的大小 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

尝试使用p5.js库移植我在javascript中制作的东西,该库具有用于2D向量的setMag函数

这是我的建议

如何设置ROBLOX/lua中2D向量的大小

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

让我们来看看向量分量是
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

在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

因此,你基本上可以认为我所说的“正确方法”不仅是一种替代方法,而且是一种更高效、更清洁的解决方案。

如果你不知道相关数学的基础知识,你怎么能编程向量的东西。。。如果你不明白自己在做什么,你总是会遇到问题。我同意@pigger的观点,这需要数学和API的知识。你显然没有合理理解的事情。在我的回答中,我把这两个结合在一起,这是一个原本不可能想到的东西。Roblox向量提供了一个量级特性,可以进一步简化,更多细节请参见我的回答。