美文网首页
如何判断多个点是否在同一个平面内

如何判断多个点是否在同一个平面内

作者: xiaoxingyun | 来源:发表于2016-11-02 21:38 被阅读1897次

在3D中,平面是到两个点距离相等的点的集合。平面是完全平的,没有厚度,且无限延伸。平面方程有两种记法如下:

ax+by+cz=d   (1)
p·n=d        (2)

所有在同一平面上的点都满足这两个方程。方程(2)中,n=[a,b,c],是平面的法向量,它垂直于平面。d是一个常量,p是平面内任意一点。如果已知n和d的值,我们就可以用这个方程式来判断一个点是否在这个平面内。
如果要确定一个平面,首先要已知三个点,因为至少三个点才能构成一个平面,假设这三个点分别为p1,p2,p3,分别用这三个点构造两个向量,e1=p2-p1,e2=p3-p2。这两个向量的叉乘得到的向量同时垂直于这两个向量,即法向量n。计算出法向量之后,再将任意一个已知点带入就能得到d的值。
得到n和d的值,也就确定了平面方程。这样,如果要判断某个点是否在这个平面内,只需要把点带入这个方程检验一下就可以啦。
代码如下:

using UnityEngine;
using System.Collections;

public class JudgePlane : MonoBehaviour
{
    [ContextMenu("input more than 3 points")]
    public Vector3[] points;
    private Vector3 normal;
    private float d;

    void simulateN()
    {
        Vector3 e1 = points[1] - points[0];
        Vector3 e2 = points[2] - points[1];
        normal = Vector3.Cross(e1, e2).normalized;
        Debug.Log("normal:  " + normal);
    }

    void simulated()
    {
        d = Vector3.Dot(points[0], normal);
    }

    bool judge(Vector3 point)
    {
        return Vector3.Dot(point, normal) == d;
    }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(points.Length <= 3)
                return;
            simulateN();
            simulated();
            for(int i = 3; i < points.Length; i++)
            {
                judge(points[i]);
                Debug.Log(points[i] + " " + judge(points[i]));
            }
        }
    }
}

嘻嘻,不知道这样算会不会复杂了。

img-be06bec6767883a94e22735ccb94f8e8.gif

相关文章

网友评论

      本文标题:如何判断多个点是否在同一个平面内

      本文链接:https://www.haomeiwen.com/subject/aqcbuttx.html