首先,三角形可以定义平面。该点必须位于三角形确定的平面上,然后才能位于三角形内部。三角形内的点具有以下特征:
三角形和点
如上图所示,当三角形顶点逆时针移动时,我们得到三个向量AB、BC和CA,它们都是点P在向量的左边(考虑向量的方向,你可以想象从A走到B,P是在左侧)。
如何判断该点是在向量点的左侧还是右侧?这个问题可以使用向量点叉乘来解决。考虑向量BC和点P,连接点B和点P得到向量BP,则
得到从垂直平面ABC向外的向量。同样,还有和。、和方向相同。数量,即点积二乘二得1。
此时使用UnityEngine就可以得到判断一个点是否在三角形内的代码如下;
使用系统集合;
公共类实用程序
{
public static bool isPointInPlane(Vector3点,Vector3 a,Vector3 b,Vector3 c)
{
Vector3 ab=Vector3.Normalize(b - a);
Vector3 bc=Vector3.Normalize(c - b);
Vector3 ca=Vector3.Normalize(a - c);
Vector3 ap=Vector3.Normalize(点- a);
Vector3 bp=Vector3.Normalize(点- b);
Vector3 cp=Vector3.Normalize(点- c);
float dotValue1=Mathf.Abs(Vector3.Dot(ab, ap));
float dotValue2=Mathf.Abs(Vector3.Dot(bc, bp));
float dotValue3=Mathf.Abs(Vector3.Dot(ca, cp));
//是否在三角形边的延长线上
if (dotValue1==1 || dotValue2==1 || dotValue3==1)
{
返回真;
}
别的
{
//任意两条边叉积得到的法线是同向还是反向
Vector3 n1=Vector3.Normalize(Vector3.Cross(ab, ap));
Vector3 n2=Vector3.Normalize(Vector3.Cross(bc, ap));
float cos=Mathf.Abs(Vector3.Dot(n1, n2));
返回cos==1;
}
}
public static bool isPointInTrangle(Vector3点,Vector3 a,Vector3 b,Vector3 c)
{
if (!isPointInPlane(点, a, b, c))
{
返回假;
}
向量3 ab=b - a;
矢量3 bc=c - b;
Vector3 ca=a - c;
Vector3 ap=点- a;
Vector3 bp=点- b;
Vector3 cp=点- c;
Vector3 n1=Vector3.Normalize(Vector3.Cross(ab, ap));
Vector3 n2=Vector3.Normalize(Vector3.Cross(bc, bp));
Vector3 n3=Vector3.Normalize(Vector3.Cross(ca, cp));
float dotValue1=Vector3.Dot(n1, n2);
浮动dotValue2=Vector3.Dot(n2, n3);
float dotValue3=Vector3.Dot(n3, n1);
返回(dotValue1==dotValue2) (dotValue2==dotValue3) (dotValue3==1);
}
}添加以下测试代码:
使用系统集合;
使用System.Collections.Generic;
使用Unity引擎;
公共类HelloUnity : MonoBehaviour
{
//Start 在第一帧更新之前调用
无效开始()
{
应用程序.targetFrameRate=60;
Vector3 a=Vector3.zero;
Vector3 b=Vector3.right;
Vector3 c=Vector3.up;
//Vector3 p=Vector3.forward; //假,假
//Vector3 p=Vector3.left; //真,假
//Vector3 p=new Vector3(0.1f, 0.1f, 0); //真,真
//Vector3 p=new Vector3(1f, 1f, 0); //真,假
Vector3 p=新Vector3(0.2f, 0.2f, 0.2f); //假,假
bool inPlane=Utils.isPointInPlane(p, a, b, c);
bool inTrangle=Utils.isPointInTrangle(p, a, b, c);
Debug.Log("inPlane:" + inPlane + ", inTrangle:" + inTrangle);
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【图形学基础知识点解析:三角形内点判定方法详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
感觉算法实现还是很实用的,现在很多图形渲染都用到这些。
有16位网友表示赞同!
终于找到了怎么判断点是否在三角形内部的方法了,太感谢分享了!
有5位网友表示赞同!
我一直觉得平面几何知识真的很基础,尤其是在做游戏或者图形相关的项目的时候。
有7位网友表示赞同!
这种方法感觉比之前自己想出来的要简单好用多了。
有20位网友表示赞同!
学习图形学其实很多时候都是从这些基石开始的,积累一点经验很不错!
有12位网友表示赞同!
看代码讲解还是好理解的多,特别是那些数学公式解释有时候挺难懂的。
有9位网友表示赞同!
对于这个题目有几种不同的方法判断吗?期待探索更多解决方案。
有14位网友表示赞同!
感觉这篇文章总结的很完备,无论是理论还是实践都涉及到!
有7位网友表示赞同!
现在越来越多的应用需要用到图形学知识了,学习一下确实很有帮助。
有5位网友表示赞同!
想深入了解一下这种算法的原理,还有没有更详细介绍?
有6位网友表示赞同!
这个点的判断方法感觉可以用在其他的几何问题上啊?
有6位网友表示赞同!
这个文章标题真的简洁明了,一目了然地知道是什么内容!
有18位网友表示赞同!
做这个项目的时候遇到过类似的问题,很感谢这份分享!
有11位网友表示赞同!
还是自己动手实践最重要,看看自己能不能用不同的语言实现这个算法。
有17位网友表示赞同!
图形学的学习方向很多,以后有机会也要深入了解一下其他的。
有8位网友表示赞同!
这种知识点确实很有实用价值,可以提高我对图形学更深刻的理解!
有8位网友表示赞同!
希望以后还能看到更多关于图形学自问自答的文章分享!
有12位网友表示赞同!
这篇文章让我对图形学的学习充满了兴趣!
有5位网友表示赞同!
以后遇到类似的问题,就可以参考这篇分享了,非常有帮助!
有8位网友表示赞同!