본문 바로가기

강의자료/수학이야기

점과 평면과의 관계

평면위의 한점에서 관계를 알고자하는 점까지의 벡터p2p를 구한다.
p2p와 평면의 노멀(법선)벡터를 내적 연산하여 그 결과값을 구한다.

내적의 결과값이 0이면 평면위의 점,
내적의 결과값이 0보다 크면 평면 앞에 있는 점,
내적의 결과값이 0보다 작으면 평면 뒤에 있는 점을 의미하게 된다.

당연히 평면의 노멀벡터가 가리키는 방향을 앞쪽이라고 가정했을 때 위와 같은 의미를 가지게 된다.

만약 원점에서 평면까지의 수직거리 D를 알고 있다면 다음과 같이 좀 더 쉽게 구할 수가 있다.
관계를 알고자 하는 점과 평면의 노멀(법선)벡터를 내적하여 원점으로부터 점까지의 평면과의 수직거리 K를 구한 후,
K에서 D를 덧셈(평면의 방향에 따라서 때로는 뺄셈) 하여 그 결과값을 구한다.

결과값이 0이면 평면위의 점.
결과값이 0보다 크면 평면 앞에 있는 점.
결과값이 0보다 작으면 평면 뒤에 있는 점을 의미하게 된다.

두 번째 방법을 이용하여 C++ 코드로 작성해 보자.

enum IntersectionRelation
{
	ISREL_FRONT = 0, // 앞면.
	ISREL_BACK,        // 뒷면.
	ISREL_PLANAR,     // 평면위.
};

// normal : 평면의 노멀벡터(정규화상태)
// point : 평면과의 관계를 알고자 하는 점.
IntersectionRelation classifyPointRelation(const Vector3d& point) const
{
	const T dist = normal.dotProduct(point) + d;

	if (dist < 0) return ISREL_BACK;

	if (dist > 0) return ISREL_FRONT;

	return ISREL_PLANAR;
}