using UnityEngine;
namespace ET
{
public static class PositionHelper
{
public static Vector3 RayCastV2ToV3(Vector2 pos)
{
return new Vector3(pos.x, 0, pos.y);
}
public static Vector3 RayCastXYToV3(float x, float y)
{
return new Vector3(x, 0, y);
}
public static Vector3 RayCastV3ToV3(Vector3 pos)
{
return new Vector3(pos.x, 0, pos.z);
}
public static Quaternion GetVector3ToQuaternion(Vector3 source, Vector3 dire)
{
Vector3 nowPos = source;
if (nowPos == dire)
{
return new Quaternion();
}
Vector3 direction = (dire - nowPos).normalized;
return Quaternion.LookRotation(direction, Vector3.up);
}
public static float Distance2D(Vector3 v1, Vector3 v2)
{
Vector2 d1 = new Vector2(v1.x, v1.z);
Vector2 d2 = new Vector2(v2.x, v2.z);
return Vector2.Distance(d1, d2);
}
public static float Vector3ToAngle360(Vector3 from, Vector3 to)
{
float angle = Vector3.Angle(from, to);
Vector3 cross = Vector3.Cross(from, to);
return cross.y > 0? angle : 360 - angle;
}
///
/// 求点到直线的距离,采用数学公式Ax+By+C = 0; d = A*p.x + B * p.y + C / sqrt(A^2 + B ^ 2)
///
///
///
///
///
public static float DistanceOfPointToVector(Vector3 startPoint, Vector3 endPoint, Vector3 point)
{
Vector2 startVe2 = startPoint.IgnoreYAxis();
Vector2 endVe2 = endPoint.IgnoreYAxis();
float A = endVe2.y - startVe2.y;
float B = startVe2.x - endVe2.x;
float C = endVe2.x * startVe2.y - startVe2.x * endVe2.y;
float denominator = Mathf.Sqrt(A * A + B * B);
Vector2 pointVe2 = point.IgnoreYAxis();
return Mathf.Abs((A * pointVe2.x + B * pointVe2.y + C) / denominator);
}
///
/// 勾股定理
///
///
///
///
public static float GGTheorem(float x, float y)
{
return Mathf.Sqrt(x * x + y * y);
}
///
/// 去掉三维向量的Y轴,把向量投射到xz平面。
///
///
///
public static Vector2 IgnoreYAxis(this Vector3 vector3)
{
return new Vector2(vector3.x, vector3.z);
}
///
/// 判断目标点是否位于向量的左边
///
/// True is on left, false is on right
public static bool PointOnLeftSideOfVector(this Vector3 vector3, Vector3 originPoint, Vector3 point)
{
Vector2 originVec2 = originPoint.IgnoreYAxis();
Vector2 pointVec2 = (point.IgnoreYAxis() - originVec2).normalized;
Vector2 vector2 = vector3.IgnoreYAxis();
float verticalX = originVec2.x;
float verticalY = (-verticalX * vector2.x) / vector2.y;
Vector2 norVertical = (new Vector2(verticalX, verticalY)).normalized;
float dotValue = Vector2.Dot(norVertical, pointVec2);
return dotValue < 0f;
}
}
}