複数の点が同じ平面内にあるかどうかを判断する方法

1698 ワード

3 Dでは、平面は2つの点までの距離が等しい点の集合である.平面は完全に平らで、厚さがなく、無限に伸びています.平面方程式には次の2つの表記があります.
ax+by+cz=d   (1)
p·n=d        (2)

同じ平面上のすべての点はこの2つの方程式を満たす.方程式(2)では,n=[a,b,c]は、平面の法線ベクトルで、平面に垂直です.dは定数であり,pは平面内の任意の点である.nとdの値が既知であれば,この方程式を用いて点がこの平面内にあるか否かを判断することができる.1つの平面を決定するには、少なくとも3つの点が1つの平面を構成することができるため、まず3つの点が知られている必要があります.この3つの点がそれぞれp 1,p 2,p 3であると仮定し、これら3つの点で2つのベクトルを構築し、e 1=p 2-p 1,e 2=p 3-p 2とします.この2つのベクトルのフォーク乗算により得られたベクトルは、この2つのベクトル、すなわち法ベクトル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