如何判斷多個點是否在同一個平面內

在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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容