算法1:通过面积法判断点P是否在三角形ABC内,如果P点在三角形内,则Sabc = Sapc + Sapb + Spbc(S代表面积)
Sabc = 向量AB ^ 向量AC / 2;//面积公式 ^ 代表叉乘 除以2 是得到三角形面积,否则得到四边形面积
unity中代码:
Vector3 a = new Vector3(0, 0); Vector3 b = new Vector3(4, 0); Vector3 c = new Vector3(0, -5); Vector3 p = new Vector3(1, -3.7501f); Vector3 pa = p - a; Vector3 pb = p - b; Vector3 pc = p - c; Vector3 t1 = Vector3.Cross(pa, pb); Vector3 t2 = Vector3.Cross(pb, pc); Vector3 t3 = Vector3.Cross(pc, pa); float sumMianJi = Vector3.Cross(a - b, a - c).magnitude * 0.5f; float mianji1 = t1.magnitude * 0.5f; float mianji2 = t2.magnitude * 0.5f; float mianji3 = t3.magnitude * 0.5f; //这里可设置阈值,在多少范围内算相等 if (Mathf.Approximately(sumMianJi, (mianji1 + mianji2 + mianji3))) { Debug.Log("在三角形内"); } else { Debug.Log("不在三角形内"); }
讯享网

算法2:若P点在ABC内部,则∠apc,∠bpc,∠bpa都是小于180度的,或者同时大于180度,用此原理则可以计算出p点是否在三角形内,
unity内代码:
讯享网 Vector3 a = new Vector3(0, 0); Vector3 b = new Vector3(4, 0); Vector3 c = new Vector3(0, -5); Vector3 p = new Vector3(1, -3.7501f); Vector3 pa = p - a; Vector3 pb = p - b; Vector3 pc = p - c; Vector3 t1 = Vector3.Cross(pa, pb); Vector3 t2 = Vector3.Cross(pb, pc); Vector3 t3 = Vector3.Cross(pc, pa); bool isIn2 = t1.z >= 0 && t2.z >= 0 && t3.z >= 0 || t1.z <= 0 && t2.z <= 0 && t3.z <= 0; Debug.Log("isIn:" + isIn2); Debug.Log("t1:" + t1 + " t2:" + t2 + " t3:" + t3);
参考链接:https://www.cnblogs.com/TenosDoIt/p/4024413.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/57321.html