using UnityEngine;
using System;
public class MathUtility
{
public static Vector3 Rotate90_XZ_CW(Vector3 vector)
{
Vector3 _vec = new Vector3(vector.z, vector.y, -vector.x);
return _vec;
}
public static Vector3 Rotate90_XZ_CCW(Vector3 vector)
{
Vector3 _vec = new Vector3(-vector.z, vector.y, vector.x);
return _vec;
}
public static Vector3 Rotate180_XZ(Vector3 vector)
{
Vector3 _vec = new Vector3(-vector.x, vector.y, -vector.z);
return _vec;
}
///
/// 返回手势方向
///
///
///
///
static public GestureType GetGestureDirection(Vector2 _start, Vector2 _end)
{
GestureType gesture;
var direction = _end - _start;
var x = direction.x;
var y = direction.y;
if (y < x && y > -x)
{
gesture = GestureType.Right;
}
else if (y > x && y < -x)
{
gesture = GestureType.Left;
}
else if (y > x && y > -x)
{
gesture = GestureType.Up;
}
else
{
gesture = GestureType.Down;
}
return gesture;
}
// public static float FreeFall(float _startY, float _time)
// {
// float deltaY = 0.5f * Constants.GRAVITY_RATE * Mathf.Pow(_time, 2f);
// return _startY - deltaY;
// }
public static float CalculateRefrenceScale(Vector2 _designWH)
{
var width = _designWH.x;
var height = _designWH.y;
var refrenceHeight = 0f;
if (Screen.height / (float)Screen.width > height / (float)width)
{
refrenceHeight = (float)width / Screen.width * Screen.height;
}
else
{
refrenceHeight = height;
}
var scale = refrenceHeight / height;
return scale;
}
public static float CalDistance(Vector3 srcPos, Vector3 desPos)
{
return (srcPos.x - desPos.x) * (srcPos.x - desPos.x) + (srcPos.z - desPos.z) * (srcPos.z - desPos.z);
}
///
/// 返回Int数据中某一位是否为1
///
///
/// 32位数据的从右向左的偏移位索引(0~31)
/// true表示该位为1,false表示该位为0
public static bool GetBitValue(uint value, ushort index)
{
if (index > 31)
{
throw new ArgumentOutOfRangeException("index"); //索引出错
}
var val = 1 << index;
return (value & val) == val;
}
///
/// 设定Int数据中某一位的值
///
/// 位设定前的值
/// 32位数据的从右向左的偏移位索引(0~31)
/// true设该位为1,false设为0
/// 返回位设定后的值
public static int SetBitValue(int value, ushort index, bool bitValue)
{
if (index > 31)
{
throw new ArgumentOutOfRangeException("index"); //索引出错
}
var val = 1 << index;
return bitValue ? (value | val) : (value & ~val);
}
public static bool IsPointInsideRectangel(Vector3 point, Vector3 rectStart, Vector3 rectEnd)
{
return point.x > rectStart.x && point.x < rectEnd.x && point.z > rectStart.z && point.z < rectEnd.z;
}
///
/// 返回角度代表的四元素
///
///
///
public static Quaternion GetClientRotationFromAngle(int angle)
{
float _angle = Mathf.Clamp(1.40625f * angle, 0f, 359f);
return Quaternion.Euler(0, _angle, 0);
}
public static float DistanceSqrtXZ(Vector3 p1, Vector3 p2)
{
p1.y = 0;
p2.y = 0;
return Vector3.SqrMagnitude(p2 - p1);
}
public static Vector3 ForwardXZ(Vector3 target, Vector3 self)
{
target.y = 0;
self.y = 0;
return (target - self).normalized;
}
public static bool IsSameDir(Vector3 vec1, Vector3 vec2)
{
vec1.y = 0;
vec2.y = 0;
return Vector3.Dot(vec1, vec2) > 0;
}
public static bool OppositeDir(Vector3 vec1, Vector3 vec2)
{
vec1.y = 0;
vec2.y = 0;
return Vector3.Dot(vec1, vec2) < 0;
}
public static int Power(int a, int e)
{
int value = 1;
for (int i = 0; i < e; i++)
{
value *= a;
}
return value;
}
public static bool CheckAdult(string _IDNumber)
{
if (string.IsNullOrEmpty(_IDNumber))
{
return false;
}
if (_IDNumber.Length == 15)
{
return true;
}
else if (_IDNumber.Length == 18)
{
var year = int.Parse(_IDNumber.Substring(6, 4));
var month = int.Parse(_IDNumber.Substring(10, 2));
var day = int.Parse(_IDNumber.Substring(12, 2));
var borth = new DateTime(year, month, day);
return (DateTime.Now - borth).TotalDays >= (365 * 18 + 4);
}
else
{
return true;
}
}
public static float GetFloatFromLitJson(LitJson.JsonData j)
{
if (j.IsDouble)
{
return (float)(double)j;
}
else if (j.IsInt)
{
return (float)(int)j;
}
return 0f;
}
}