Intersection with a ray and an AABB

광선과 AABB가 교차하는지를 평가하는 함수이다. 이 함수는 Stefan Zerbst의 책 “3D Game Engine Programming”의 138~140쪽에 나오는 ZFXRay::Intersects 함수를 VB.NET으로 변환한 것이다. 이 함수의 원천적인 알고리즘은 Andrew Woo의 알고리즘에서 비롯한 것이다.

DoEvents함수를 효과적으로 사용하기

DoEvents함수는 CPU-intensive code를 예방하는 방법 중의 하나이다.
수치해석과 같이 CPU계산량이 많은 응용프로그램일 경우, 계산에만 몰두하느라 다른 응용프로그램을 사용할 수 없게 된다. 해당 프로그램도 응답이 없어 마치 죽은(?) 듯한 반응을 보인다. 이를 방지하기 위해서 다른 응용 프로그램에도 CPU사용을 허락하는 것이 DoEvents함수이다.
이렇듯 좋은 취지의 함수이지만, 이 함수를 남발할 경우 오히려 계산속도가 현저히 떨어지는 상황을 맞이할 수 있다. 그럼 어떻게 할 것인가?

1)DLL 함수 선언

2)함수 사용

이렇게 하면 입력값이 있을 때만, DoEvents 함수를 호출한다.
그냥 DoEvents함수를 사용하는 경우보다 계산속도가 빠르다.

DXF를 읽어오는 모듈을 정리

과거 동적배열로 된 변수들을 Generic.List와 Generic.Dictionary로 변경하였다. 파일 읽는 시간이 놀랍게 줄었다.
리스트와 딕셔너리도 마치 동적배열처럼 사용할 수 있다.

구성 요소 아이콘이 도구상자에 표시되지 않음

Visual Basic 2005를 사용하다가 “구성 요소 아이콘이 도구 상자에 표시되지 않는” 황당한 경우을겪었다.
해결책은 http://msdn2.microsoft.com/ko-kr/library/ms171843.aspx에 있었다.
그 내용인즉은 다음과 같다.

 Visual Studio에서 ToolboxBitmapAttribute를 사용하여 아이콘을 사용자 지정 구성 요소에 연결할 경우 비트맵은 자동 생성된 구성 요소의 도구 상자에 나타나지 않습니다. 비트맵을 보려면 도구 상자 항목 선택 대화 상자를 사용하여 컨트롤을 다시 로드합니다.

한마디로
메뉴 -> 도구 -> 도구 상자 항목 선택 -> “다시 설정”을 누른다.

Structure와 Class

선택사항을 저장하는 구조체를 만들었는데, 원본 구조체의 값이 변경되지 않았다. 구조체를 전달할 때, ByRef를 사용했음에도 불구하고 원본 값이 변경되지 않았다. 그래서 클래스로 변경하니 원본의 값이 변경되었다.
구조체를 사용해서 인자를 전달하면, 원본에는 아무런 변화가 없다.

연산자 Mod를 재발견

For문 등에서 배열을 계산하다보면, 인덱스의 범위를 넘어가는 경우가 생긴다. 이때 Mod[footnote]c/c++에서는 %연산자를 이용한다.[/footnote]를 사용하면 편리하다.

(출처 : http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/)

형변환 연산자

점은 위치 벡터로 해석할 수 있다. 곧 점과 벡터는 서로 밀접한 관련이 있다. 표현되는 형식도 비슷하다. 이를 코드에서 어떻게 표현할 것인가가 문제였다. 형변환 연산자를 정의하므로 해결할 수 있었다.
형변환 연산자를 정의해 놓으면, 자동으로 형을 변환하여 계산하게 된다. 이야호!
아래의 내용은 점을 벡터로 확대변환을 하는 것이다. 이로써 인자를 벡터로 받는 곳에 그냥 점을 넘겨줘도 자동으로 형이 변환된다.

변환 프로시저에서 Widening 외에 Public Shared도 지정해야 한다.
확대 변환은 런타임에 항상 성공하며 데이터 손실이 없다. Single을 Double로 변환하거나 Char를 String으로 변환하거나 파생된 형식을 해당 기본 형식으로 변환하는 예를 들 수 있다. 파생된 형식에는 기본 형식의 모든 멤버가 포함되어 기본 형식의 인스턴스가 되므로 파생된 형식을 해당 기본 형식으로 변환하는 것은 확대 변환이다.
Option Strict가 On으로 설정되어 있는 경우에도 사용하는 코드에서 확대 변환에 대해 CType을 사용할 필요가 없다.

화면의 스케일에 상관없이 항상 1 픽셀의 굵기로 선을 그리기

화면의 스케일에 따라 선의 굵기가 달라진다. 즉, 확대 혹은 축소하는 과정에서 선의 굵기가 달라지게 된다. 이를 방지하기 위해서는 선의 굵기를 ‘-1’로 설정한다. 그러면 항상 1 픽셀의 굵기로 선을 그릴 수 있다.

부울 변수의 변환

Visual Basic에서 숫자 데이터 형식 값을 Boolean으로 변환하는 경우 0은 False가 되고 다른 모든 값은 True가 된다. Visual Basic에서 Boolean 값을 숫자 값으로 변환하는 경우 False는 0이 되고 True는 -1이 된다. 반면에 C/C++ 또는 Java는 True값을 1로 하기에 바로 수식 계산에 이용할 수 있다. 다른 언어의 이와 같은 코드를 바로 옮기면 오류가 발생할 수 있다.

연산자 중복정의(operator overload)

VB2005는 VB2003과 달리 연산자 중복정의를 할 수 있다. 다음은 행렬계산에서 곱셈(*)에 대한 연산자 중복정의를 한 코드이다.