相交 - 点是否在射线上
效果
//点是否在射线上 public static bool IsPointOnRay(Vector2 o, Vector2 dir, Vector2 p) { var op = p - o; if (Mathf.Approximately(op.sqrMagnitude, 0)) //o和p重叠 return true; //共线且夹角为0度则在射线上 float cross = V2Cross(ref dir, ref op); if (!Mathf.Approximately(cross, 0)) //float.Epsilon, 先判断共线 return false; float dot = Vector2.Dot(dir, op); //|dir|*|op|*cos(a); 共线时, cos值>0就是0度 return dot > 0; }
点与射线的位置关系
在射线上
不在射线上
测试代码
using System; using UnityEngine; public class RayTest : CollideTestBase { public Transform m_RayEnd; //射线指向位置 public Transform m_Point; //要检测的点 void Update() { m_IsIntersect = false; if (m_Point && m_RayEnd) { var rayOrigin = this.transform.position; var rayDir = m_RayEnd.position - rayOrigin; var t1 = DateTime.Now; switch (m_ApiType) { case 1: for (int i = 0; i < m_InvokeCount; ++i) m_IsIntersect = Shape2DHelper.IsPointOnRay(rayOrigin, rayDir, m_Point.position); break; } CheckTimeCost(t1, 1); } } private void OnDrawGizmos() { if (m_RayEnd) { var rayOrigin = this.transform.position; rayOrigin.z = 0; var rayEnd = m_RayEnd.position; rayEnd.z = 0; if (m_IsIntersect) { Gizmos.color = Color.red; Gizmos.DrawLine(rayOrigin, rayEnd); Gizmos.color = Color.white; } else { Gizmos.DrawLine(rayOrigin, rayEnd); } } } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步