평면과 선의 교차점 구하기

하나의 평면에 대해서 2가지의 평면공식이 도출되는데, 이 2가지 평면의 공식에 대해서.. 선과 평면에 대한 교차점을 구하는 방법에 대해서 논의해 보겠습니다. 이 자료는 1991년에 작성된 Paul Bourke(http://local.wasp.uwa.edu.au)님의 글을 좀더 알기 쉽게 풀어 쓴 글입니다.
사용자 삽입 이미지방법 1.

점 P는 평면 위의 임이의 점이고, N은 법선벡터이며 P3는 이미 알고 있는 평면상의 점이라고 하면 평면의 공식은 우리가 고등학교때 배운 평면의 방정식의 형태인, 다음처럼 기술됩니다.

사용자 삽입 이미지
평면을 수학적으로 기술했으니, 이제는 선에 대한 공식을 알아볼 차례입니다. 이제 앞에서 언급한 점 P를 평면과 선과의 교차점이라고 하면, 점 P는 선에 대한 점입니다. 그리고 선이 지나는 이미 알고 있는 2개의 점을 각각 P1, P2라고 하면 선에 대한 공식은 수학적으로 다음과 같습니다.

사용자 삽입 이미지
위에서 u는 선에 대한 기울기 값이 되겠지요. 이제.. 평면의 공식에서 P에 선의 공식을 대입할 수 있는 형태입니다. 대입해 보면 아래와 같습니다.

사용자 삽입 이미지
위의 식을 u에 대해서 전개해 보면 아래와 같은 공식이 됩니다.

사용자 삽입 이미지

이제 u값을 구했으니.. 이 u값을 선에 대한 공식에 대입하여 교차점 P를 구할 수 있습니다. 다음은 주의할 점입니다.

  • 만약 u에 대한 식에서 분모가 0이면, 주어진 선과 평면의 법선은 수직이라는 의미입니다. 즉, 이말은 평면과 선은 서로 만나지 않는다는 의미입니다.
  • 교점 P가 P1과 P2 사이에 있는지 검사해야한다면, u값이 0~1사이의 값인지 확인해 보면 됩니다.

방법 2.

이제 평면에 대한 공식으로, 고등학교때 배운 또 다른 형태는 다음과 같습니다.

사용자 삽입 이미지
(x,y,z)는 평면상의 점이고 (A,B,C)는 평면에 대한 법선벡터이며 D는 이 법선벡터의 길이값입니다. 이 형태의 평면방정식은 임이의 점에 대해서 위의 공식에 대입하여 그 값이 양수인경우 평면을 경계로 법선벡터가 향하는 부분에 존재하는 것이고, 음수인경우는 그 반대방향에 존재하는 것을 간단히 판단할 수 있습니다.

P1(x1,y1,z1)과 P2(x2,y2,z2)를 지나는 선에 대한 공식을 방법1에서의 선에 대한 공식… 다시 언급해 보면 아래와 같습니다.

사용자 삽입 이미지
위의 선 공식을 방법2에서의 평면의 공식에 대입해 보면 다음과 같은 형태로 전개됩니다.

사용자 삽입 이미지
위의 식을 u에 대해서 정리해 보면…

사용자 삽입 이미지
이제 u를 구했으니, 방법1과 마찬가지로 교점을 구할 수 있습니다. 이 방법에 대해 주의할 점은 방법 1과 동일합니다.

[GIS] DBF 필드값 최적화시켜 용량 대폭 줄여주는 툴, OptimizeDBF

간혹, 사실은 거의 대부분.. 가지고 있는 Shape 파일의 속성 정보인 DBF 파일이 내용에 비해 그 용량이 매우 크게 느껴질때가 있습니다. 하나의 예로 아래는 제가 가지고 있는 62MB 크기의 DBF 파일의 덤프 내용입니다. 가장 윗부분에 필드 이름이 정의되어져 있고, 그 아래로 쭈욱~ 값들이 기록되어져 있는데.. 실제 내용보다는 빈문자열이 훨씬 많습니다. 이렇게 된 이유는, 특히 문자열 필드의 경우 길이를 기본적으로 255자로 정의하고 DBF를 생성했기 때문입니다.

사용자 삽입 이미지
아래는 이런 불성실한 ^^; DBF 파일의 용량을 줄여주는 툴입니다. 필드값을 저장할 수 있는 필드의 최대 길이를 자동으로 계산해 줌으로써 사용자가 따로 계산할 필요가 없습니다. 또한 저장할 필드를 따로 선택해 저장시킬 수 있습니다.

사용자 삽입 이미지
위의 툴을 이용해 생성된 DBF 파일의 덤프 내용은 아래와 같습니다. 용량이 62MB에서 3.45MB로 꽤나 많이 줄었습니다.

사용자 삽입 이미지
이 툴을 만들게 된 목적은 개발중인 맵 엔진(XGE)에 데이터를 제공하는 웹방식의 데이터서버가 관리하고 있는 속성 데이터를 최적화시킬 목적으로 만들게 되었습니다. XGE 지도 엔진을 만들기 위한 Core 라이브러리를 이용해 제작했습니다.

[GIS] DXF를 ESRI Shape로 변환해주는 툴, DXF to SHP

DXF를 ESRI의 SHP 파일로 변환해주는 툴입니다. 수치지도 DXF 파일과 내보낼 레이어를 선택하고, 변환될 Shape의 종류를 선택해주면 Shape 파일로 생성해 주는 간단한 툴입니다. 개발중인 맵 엔진에 DXF 수치지도를 표시하는 기능에 대비해, 회사에서 DXF를 Shape 파일로 변환해야할 일이 생겨서 겸사 겸사 만들어 보았습니다. Shape의 속성은 Layer 명 하나만 만들어 집니다.

사용자 삽입 이미지
사용하기 전에 알면 좋은 점이.. DXF 수치지도를 Point나 Polyline, Polygon으로 내보기기 할때 DXF에서 이용할 Enitity입니다.

  • Point : CAD의 INSERT 엔티티를 사용
  • Polyline : CAD의 POLYLINE 엔티티를 사용
  • Polygon : CAD의 POLYLINE 엔티티를 사용하며, 폐합된 엔티티만을 Polygon으로 내보냄(만약 Force Close-Polygon을 체크하면 강제로 폐합시키고 모든 엔티티를 내보냄)

아래는 화면은 이 툴을 이용해 실제 수치지도를 등고선 레이어 7XXX 대를 폴리라인으로 내보내기 해서 ArcMap으로 살펴본 화면입니다.

사용자 삽입 이미지
이 툴은 XGE 지도 엔진을 이용하지 않고, XGE 지도 엔진을 구현하기 위한 Core 라이브러리를 이용해 개발하였습니다. C++로 개발된지라 .NET 2.0 역시 필요치 않습니다.

[C++] Template Summary – 3/3

클래스 템플릿도 특수화가 가능하며, 특수화를 위해서는 특수화 대상이 되는 템플릿 클래스가 필요하다. 아래는 대상이 되는 템플릿 클래스와 이를 특정 타입(double)에 대해 특수화 시킨 예이다.

template class BASE {
public:
	T func() {};
};

template<> class BASE {
public:
	int FuNc(float v) {};
};

주지할 점은  기본 대상이 되는 클래스 템플릿인 BASE와 double 타입에 대해 특수화된 클래스 템플릿 BASE는 완전히 별개의 클래스라는 점으로, 위처럼 서로 가지고 있는 맴버에 공통점이 없다.

템플릿 클래스 자체를 특수화하는 경우 뿐만 아니라, 가지고 있는 맴버 함수만을 콕… 지정해서 특수화 하는 것도 가능하다. 아래는 그 예이다.

template class BASE {
public:
    T func() {};
};

template<> int BASE::func()
{
	// another implementation for int type
}

위의 예는 BASE 함수의 func 함수에 대해 T가 int일때에 대한 특수화의 예이다.

템플릿 인자열 변형을 통한 특수화, 즉 클래스 템플릿 부분 특수화의 예

template class CLASS_NAME {}; //
template class CLASS_NAME<T*, T, i> {};     //
template class CLASS_NAME<char, T, 5> {};          //
template class CLASS_NAME<T*, T, 0> {};            //

이 특수화 대상이 되는 원래 클래스 템플릿이며, , , 가 클래스 템플릿 부분 특수화의 경우이다.

클래스 템플릿이 사용되는 경우는 아래와 같다.

CLASS_NAME<int, double, 10> a;

, , 에 대한 실제 사용 예는 아래와 같으며 순서대로 각 , , 에 일치한다.

CLASS_NAME<int*, int, 20> b;
CLASS_NAME<char, float, 5> c;
CLASS_NAME<char*, char, 3> d;

주목할 점은 클래스 템플릿 부분 특화의 경우 특수화 대상이 되는 원래 클래스 템플릿과 템플릿 인자의 개수가 정확히 일치해야한다. 위의 경우 3개로써 <type, type, int value>이다. 또한 , , , 의 템플릿 클래스는 서로 완전이 다른 클래스 라는 점이며, 단지 템플릿을 통한 관계를 유일한 공통점으로 가지고 있다.