相交 - 点是否在射线上

效果

 

//点是否在射线上
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);
            }
        }
    }

}

 

posted @ 2023-11-23 23:19  yanghui01  阅读(13)  评论(0编辑  收藏  举报