设置二维向量的大小

3
尝试使用p5.js库中的setMag函数将我用JavaScript编写的某个东西移植过来,该函数用于2D向量。
这是它的文档链接:documentation for it 如何在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

如果你不了解相关数学的基础知识,又怎么能编写向量相关的程序呢?如果你不明白自己在做什么,那么问题就会一直出现。 - Piglet
我同意 @piglet 的说法,这些东西需要对数学和API都有一定的了解。很明显你对此并没有合理的理解。在我的答案中,我将这两者结合在一起,否则是无法想到的。 - warspyking
2个回答

10
我们假设向量的分量为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

1
Roblox向量提供了一个magnitude属性。http://wiki.roblox.com/index.php?title=Vector2#Magnitude_property - Piglet
这可以进一步简化,详细信息请参考我的答案。 - warspyking

1
在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

所以你可以把我所说的“正确方式”不仅仅看作是一种“替代方案”,而是更高效、更干净的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接