/* * @FileName: LMath.LVector.cs * @Date: 2024-04-20 20:06:15 * @LastEditTime: 2024-04-22 22:58:25 * @Description: 定点数向量计算相关数学方法 */ namespace JNGame.Math { public static partial class LMath { public static LVector3 Transform(ref LVector3 point, ref LVector3 axis_x, ref LVector3 axis_y, ref LVector3 axis_z, ref LVector3 trans) { return new LVector3(true, ((axis_x.RawX * point.RawX + axis_y.RawX * point.RawY + axis_z.RawX * point.RawZ) / LFloat.Precision) + trans.RawX, ((axis_x.RawY * point.RawX + axis_y.RawY * point.RawY + axis_z.RawY * point.RawZ) / LFloat.Precision) + trans.RawY, ((axis_x.RawZ * point.RawX + axis_y.RawZ * point.RawY + axis_z.RawZ * point.RawZ) / LFloat.Precision) + trans.RawZ); } public static LVector3 Transform(LVector3 point, ref LVector3 axis_x, ref LVector3 axis_y, ref LVector3 axis_z, ref LVector3 trans) { return new LVector3(true, ((axis_x.RawX * point.RawX + axis_y.RawX * point.RawY + axis_z.RawX * point.RawZ) / LFloat.Precision) + trans.RawX, ((axis_x.RawY * point.RawX + axis_y.RawY * point.RawY + axis_z.RawY * point.RawZ) / LFloat.Precision) + trans.RawY, ((axis_x.RawZ * point.RawX + axis_y.RawZ * point.RawY + axis_z.RawZ * point.RawZ) / LFloat.Precision) + trans.RawZ); } public static LVector3 Transform(ref LVector3 point, ref LVector3 axis_x, ref LVector3 axis_y, ref LVector3 axis_z, ref LVector3 trans, ref LVector3 scale) { long num = (long) point.RawX * (long) scale.RawX /LFloat.Precision; long num2 = (long) point.RawY * (long) scale.RawX/LFloat.Precision; long num3 = (long) point.RawZ * (long) scale.RawX/LFloat.Precision; return new LVector3(true, (int) (((long) axis_x.RawX * num + (long) axis_y.RawX * num2 + (long) axis_z.RawX * num3) /LFloat.Precision) + trans.RawX, (int) (((long) axis_x.RawY * num + (long) axis_y.RawY * num2 + (long) axis_z.RawY * num3) /LFloat.Precision) + trans.RawY, (int) (((long) axis_x.RawZ * num + (long) axis_y.RawZ * num2 + (long) axis_z.RawZ * num3) /LFloat.Precision) + trans.RawZ); } public static LVector3 Transform(ref LVector3 point, ref LVector3 forward, ref LVector3 trans) { LVector3 up = LVector3.Up; LVector3 vInt = Cross(LVector3.Up, forward); return LMath.Transform(ref point, ref vInt, ref up, ref forward, ref trans); } public static LVector3 Transform(LVector3 point, LVector3 forward, LVector3 trans) { LVector3 up = LVector3.Up; LVector3 vInt = Cross(LVector3.Up, forward); return LMath.Transform(ref point, ref vInt, ref up, ref forward, ref trans); } public static LVector3 Transform(LVector3 point, LVector3 forward, LVector3 trans, LVector3 scale) { LVector3 up = LVector3.Up; LVector3 vInt = Cross(LVector3.Up, forward); return LMath.Transform(ref point, ref vInt, ref up, ref forward, ref trans, ref scale); } public static LVector3 MoveTowards(LVector3 from, LVector3 to, LFloat dist) { LFloat sqrtMagnitude = (to - from).SqrMagnitude; LFloat sprtDist = dist * dist; if (sqrtMagnitude <= sprtDist) { return to; } LFloat f = sprtDist / sqrtMagnitude; return LVector3.Lerp(from, to, f); } /// /// 方向向量转角度 /// /// /// public static LFloat ToDeg(this in LVector2 vec) { var ccwDeg = LMath.Atan2(vec.y, vec.x) * LMath.Rad2Deg; var deg = 90 - ccwDeg; var rawVal = deg.rawValue % ((LFloat)360).rawValue; return new LFloat(true, rawVal); } public static LFloat AngleInt(LVector3 lhs, LVector3 rhs) { return LMath.Acos(Dot(lhs, rhs)); } public static LFloat Dot(in LVector2 u, in LVector2 v) { return LVector2.Dot(u, v); } public static LFloat Cross(in LVector2 u, in LVector2 v) { return LVector2.Cross(u, v); } public static LVector2 Lerp(in LVector2 from, in LVector2 to, in LFloat f) { return LVector2.Lerp(from, to, f); } public static LFloat Dot(in LVector3 u, in LVector3 v) { return LVector3.Dot(u, v); } public static LVector3 Cross(in LVector3 u, in LVector3 v) { return LVector3.Cross(u, v); } public static LVector3 Lerp(in LVector3 from, in LVector3 to, in LFloat f) { return LVector3.Lerp(from, to, f); } } }