VectorHelper = {} function VectorHelper.Dot(v1, v2) return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z end function VectorHelper.Mul(v1, v2) return Vector.New(v1.X * v2.X, v1.Y * v2.Y, v1.Z * v2.Z) end function VectorHelper.MulScalar(v1, S) return Vector.New(v1.X * S, v1.Y * S, v1.Z * S) end function VectorHelper.MulScalar2D(v1, S) return Vector.New(v1.X * S, v1.Y * S, 0) end function VectorHelper.MulNumber(v1, number) return Vector.New(v1.X * number, v1.Y * number, v1.Z * number) end function VectorHelper.MulNumber2D(v1, number) return Vector.New(v1.X * number, v1.Y * number, 0) end function VectorHelper.Sub(v1, v2) return Vector.New(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z) end function VectorHelper.Sub2D(v1, v2) return Vector.New(v1.X - v2.X, v1.Y - v2.Y, 0) end function VectorHelper.Add(v1, v2) return Vector.New(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z) end function VectorHelper.Add2D(v1, v2) return Vector.New(v1.X + v2.X, v1.Y + v2.Y, 0) end function VectorHelper.Div2DScalar(v1, s) return Vector.New(v1.X / s , v1.Y / s, 0); end function VectorHelper.ToString(v) return string.format("(%.2f,%.2f,%.2f)", v.X, v.Y, v.Z) end function VectorHelper.RotToString(v) return string.format("(Roll = %.2f, Pitch = %.2f, Yaw = %.2f)", v.Roll, v.Pitch, v.Yaw) end function VectorHelper.ToString2D(v) if v == nil then return "[X=Nil,Y=Nil]"; end return string.format("[%f, %f]", v.X, v.Y); end function VectorHelper.ToStringInt2D(v) if v == nil then return "[X=Nil,Y=Nil]"; end return string.format("[%d, %d]", v.X, v.Y); end function VectorHelper.ToIntString(v) return "(" .. tostring(math.floor(v.X)) .. "," .. tostring( math.floor(v.Y)) .. "," .. tostring(math.floor(v.Z)) .. ")"; end function VectorHelper.Cross(v1, v2) return Vector.New(v1.Y * v2.Z - v2.Y * v1.Z, v1.Z * v2.X - v2.Z * v1.X, v1.X * v2.Y - v2.X * v1.Y) end function VectorHelper.GetDistance(vector1, vector2) if vector1 == nil or vector2 == nil then return 0 end if vector1.X == nil or vector2.X == nil then return 0 end if vector1.Y == nil or vector2.Y == nil then return 0 end if vector1.Z == nil or vector2.Z == nil then return 0 end local disX = vector1.X - vector2.X local disY = vector1.Y - vector2.Y local disZ = vector1.Z - vector2.Z return math.sqrt(disX ^ 2 + disY ^ 2 + disZ ^ 2) end function VectorHelper.GetDistance2D(vector1, vector2) if vector1 == nil or vector2 == nil then return 0 end if vector1.X == nil or vector2.X == nil then return 0 end if vector1.Y == nil or vector2.Y == nil then return 0 end local disX = vector1.X - vector2.X local disY = vector1.Y - vector2.Y return math.sqrt(disX ^ 2 + disY ^ 2) end function VectorHelper.LengthSquared(v) return v.X ^ 2 + v.Y ^ 2 + v.Z ^ 2 end function VectorHelper.LengthSquared2D(v) return v.X ^ 2 + v.Y ^ 2 end function VectorHelper.Length(v) return math.sqrt(VectorHelper.LengthSquared(v)) end function VectorHelper.Length2D(v) return math.sqrt(VectorHelper.LengthSquared2D(v)) end function VectorHelper.ToLuaTable(v) return {X = v.X, Y = v.Y, Z = v.Z} end function VectorHelper.ToLuaTable2D(v) return {X = v.X, Y = v.Y, Z = 0} end function VectorHelper.RotToLuaTable(v) return {Roll=v.Roll, Pitch=v.Pitch, Yaw=v.Yaw} end function VectorHelper.ColorToVector(LinearColor) return {X = LinearColor.R, Y = LinearColor.G, Z = LinearColor.B } end function VectorHelper.RotToString(v) return string.format("Roll=%.2f, Pitch=%.2f, Yaw=%.2f", v.Roll, v.Pitch, v.Yaw); end function VectorHelper.GetMiddlePoint(vector1, vector2) return {X = (vector1.X + vector2.X) / 2, Y = (vector1.Y + vector2.Y) / 2,Z = (vector1.Z + vector2.Z) / 2} end function VectorHelper.FromCpp(CppVector) return {X = CppVector.X, Y = CppVector.Y, Z = CppVector.Z}; end function VectorHelper.Equal(vector1, vector2) return (vector1.X == vector2.X and vector1.Y == vector2.Y and vector1.Z == vector2.Z); end --计算两点之间连线与Y轴的夹角 function VectorHelper.GetAngleByPos(PosA,PosB) local P = {}; P.X = PosB.X - PosA.X; P.Y = PosB.Y - PosA.Y; local Pi = 3.1415926; local Dis = math.sqrt( (P.X * P.X) + (P.Y * P.Y)); local FAngle = math.acos (P.Y/ Dis); if( P.X < 0) then FAngle = 2 * Pi - FAngle; end local Angle = FAngle * 180 / Pi; Angle = Angle > 0 and (90 - Angle) or (90 + math.abs(Angle)); return Angle; end function VectorHelper.RotZero() return {Roll = 0, Pitch = 0, Yaw = 0} end function VectorHelper.VectorZero() return {X = 0, Y = 0, Z = 0} end function VectorHelper.ScaleOne() return {X = 1, Y = 1, Z = 1} end function VectorHelper.CosineValue(v1, v2) return VectorHelper.Dot(v1, v2) / (VectorHelper.Length(v1) * VectorHelper.Length(v2)) end return VectorHelper;