首页 > 其他分享 >相交 - 点是否在射线上

相交 - 点是否在射线上

时间:2023-11-23 23:35:20浏览次数:30  
标签:origin 是否 相交 DirTransform 射线 var public dir op

效果

 

//点是否在射线上
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 : MonoBehaviour
{
    public Transform m_DirTransform;
    public Transform m_PointTransform;

    public int m_ApiType = 1;
    [Range(1, 3999999)]
    public int m_InvokeCount = 1; //用于测试大批量调用时的性能
    public bool m_AutoIcrApiType = false; //自动调用每一个函数, 看看各个函数的执行耗时

    private bool m_IsOnRay = false;

    void Update()
    {
        m_IsOnRay = false;
        if (m_PointTransform && m_DirTransform)
        {
            var origin = this.transform.position;
            var dir = m_DirTransform.position - origin;

            var t1 = DateTime.Now;
            switch (m_ApiType)
            {
            case 1:
                for (int i = 0; i < m_InvokeCount; ++i)
                    m_IsOnRay = Shape2DHelper.IsPointOnRay(origin, dir, m_PointTransform.position);
                break;
            }

            if (m_InvokeCount > 1 && m_AutoIcrApiType)
            {
                if (m_ApiType < 2)
                    m_ApiType++;
            }

            if (m_InvokeCount > 1)
            {
                var t2 = DateTime.Now;
                var dur = t2 - t1;
                if (dur.TotalMilliseconds >= 100)
                {
                    Debug.Log($"totalMs:{dur.TotalMilliseconds}");
                }
            }
        }
    }

    private void OnDrawGizmos()
    {
        if (m_DirTransform)
        {
            var origin = this.transform.position;
            origin.z = 0;
            var endPoint = m_DirTransform.position;
            endPoint.z = 0;

            if (m_IsOnRay)
            {
                Gizmos.color = Color.red;
                Gizmos.DrawLine(origin, endPoint);
                Gizmos.color = Color.white;
            }
            else
            {
                Gizmos.DrawLine(origin, endPoint);
            }
        }
    }

}

 

标签:origin,是否,相交,DirTransform,射线,var,public,dir,op
From: https://www.cnblogs.com/sailJs/p/17852130.html

相关文章

  • 验证私钥与公钥证书是否匹配
    客户通过生成的CSR,申请了公钥证书,可以使用以下命令来验证私钥、公钥证书、CSR文件是否匹配,如果打印的哈希值是一致的,则证明匹配,否则就是不匹配。最好不要用网上的在线验证,因为私钥万一泄漏了,那可就是重大安全问题了,一定要在自己手里保护好。打印私钥opensslpkey-inprivateKey.......
  • 电脑网站支付报错“验签出错,建议检查签名字符串或私钥与应用公钥是否匹配”问题解决记
    在对接支付宝电脑网站支付的时候,遇到如下报错:“错误代码invalid-signature错误原因:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配”。但展示的报错内容跟实际原因有所出入(在下文中有解答),这里记录下问题的解决排查过程。问题复现在对接电脑网站支付时,生成form表单......
  • 重心法判断点是否在三角形内
    1)点在三角形的边上时AP=AE+AF(向量加法)设AE=v*AB,AF=u*AC; 则AP=v*AB+u*AC(二元一次方程,u,v为我们引入的变量)根据向量三点共线定理可知:u+v=1 2) 点在三角形内时AE不变, 让AF变短一些, 当用u*AC表示AF时,u的值肯定也比1)中小了,所以此时u+v<1 所以点是否在三......
  • HashMap HashTable ConcurrentMap 中key value是否可以为null
    HashMapHashTableConcurrentMap中keyvalue是否可以为null先说结论hashmap的key,value都可以为null;当key重复时,第二个key的value会覆盖第一个key的valueHashTable它的key和value都是不能为null的ConcurrentMap存储数据,它的key和value都是不能为null的1.HashMap//key为nullvalue......
  • 面试题 02.07. 链表相交
    2023-11-21面试题02.07.链表相交-力扣(LeetCode)思路:1暴力法:判断的是next是不是相等1hashmap存储其中一个的全部,遍历另一个看是不是在map中(用set就行,不用map)2双指针:用2个指针分别遍历2链表(都是遍历完一个继续遍历另一个),最终会相等的,相等就是找到了暴力法:/***Defi......
  • vue 检测可视区域大小及是否改变
    表格height:'auto',如果是只有一个vxe-grid还好,会自动伸展高度,但是多个展示的时候,比如左侧列表,右侧显示一个流程。这样height:'auto',发现不太好使。这样就要计算可视区域高度,并进行动态处理。  constareaHeight=ref(0); onMounted(()=>{areaHeight.value=d......
  • 判断字符串是否只含有数字
    判断字符串是否只含有数字使用commons.lang包工具类importorg.apache.commons.lang3.StringUtils;StringUtils.isNumeric(tmpStr)底层实现判断每一个字符是否是数字publicstaticbooleanisNumeric(finalCharSequencecs){if(isEmpty(cs)){re......
  • go接口判断是否为nil
    variinterface{}varx*inti=x//不赋值时i接口为isanil,反射reflect.ValueOf(i).IsNil()会panilifi!=nil{fmt.Println("i!=nil")}else{fmt.Println("isanil")}ifreflect.ValueOf(i).IsNil(){fmt.Print......
  • .NET8.0 AOT 经验分享 - 专项测试各大 ORM 是否支持
    AOT特点发布和部署本机AOT应用具有以下优势:最大程度减少磁盘占用空间:使用本机AOT发布时,将生成一个可执行文件,其中仅包含支持程序所需的外部依赖项的代码。减小的可执行文件大小可能会导致:较小的容器映像,例如在容器化部署方案中。缩短了较小映像的部署时间。缩短启动......
  • DDOS攻击,流量超导致经济损失,考虑是否自己托管服务器,不要用云服务器
    云服务器还是要小心,流量超标。erwa前几天阿里云宕掉了。考虑有些大一点的公司在考虑是否自己托管服务器,不要用云服务器。云服务器,续费涨价,故障,流量,扩展等问题,根据自己的需要考虑是否采用。   ......