几何向量(12):点与三角形

      判断点在三角形内部,属于三维开发中很常用的一种算法,之前搞忘记说了,前面我们判断射线与平面,如果再加上判断交点是否在三角形内的计算就更好了。

      好,假设我们有个三角形,和三角形所在平面的一个点,那么怎么判断点与三角形的关系,先来个示意图,如下:

image.png

可以看的出来,如果点P在三角形内部,那么P与三角形ABC组成的六个夹角之和为180°(三角形内角和180°),如果在三角形外部,则不然。ps:这里我们不考虑signed旋转角正负号问题。


      那么判断算法就很容易实现了,使用余弦定理/点积/内置API,随意怎么计算就行(还不了解计算原理的回过头去看下),下面实现一下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PointTriangle : MonoBehaviour
{
    public Transform A;
    public Transform B;
    public Transform C;
 
    public Transform P;
 
    private Vector3 PosA;
    private Vector3 PosB;
    private Vector3 PosC;
    private Vector3 PosP;
 
    void Start()
    {
 
    }
 
    void Update()
    {
        PosA = A.position;
        PosB = B.position;
        PosC = C.position;
        PosP = P.position;
 
#if UNITY_EDITOR
        Debug.DrawLine(PosA, PosB, Color.black);
        Debug.DrawLine(PosB, PosC, Color.black);
        Debug.DrawLine(PosC, PosA, Color.black);
#endif
        bool result = CheckPointInTriangle(PosP, PosA, PosB, PosC);
#if UNITY_EDITOR
        Color col = result ? Color.black : Color.red;
        Debug.DrawLine(PosA, PosP, col);
        Debug.DrawLine(PosB, PosP, col);
        Debug.DrawLine(PosC, PosP, col);
#endif
    }
 
    private bool CheckPointInTriangle(Vector3 posP, Vector3 posA, Vector3 posB, Vector3 posC)
    {
        float angleBAP = Vector3.Angle(posB - posA, posP - posA);
        float anglePAC = Vector3.Angle(posP - posA, posC - posA);
        float angleACP = Vector3.Angle(posA - posC, posP - posC);
        float anglePCB = Vector3.Angle(posP - posC, posB - posC);
        float angleCBP = Vector3.Angle(posC - posB, posP - posB);
        float anglePBA = Vector3.Angle(posP - posB, posA - posB);
 
        float angle = angleBAP + anglePAC + angleACP + anglePCB + angleCBP + anglePBA;
#if UNITY_EDITOR
        Debug.LogFormat("angle = {0}", angle);
#endif
        if (Mathf.Approximately(angle, 180.0f))
        {
            return true;
        }
        return false;
    }
}

效果如下:

499.gif

 当然还有其他方法,后面聊,现在主要看微积分在。


————————————————

版权声明:本文为CSDN博主「羊羊2035」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/yinhun2012/article/details/100150697



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864