화살표도 도면정보와 마찬가지로 변환할 수 있도록 함. 변환에 따른 향을 언제나 정확하게 전달하기 위함임.
그림자 추가
그림자는 기본적으로 오블리크 투영(oblique projection)이다.
건물 정보를 oblique projection하면 그림자의 모양이 완성되는 것이다.
연산자 Mod를 재발견
For문 등에서 배열을 계산하다보면, 인덱스의 범위를 넘어가는 경우가 생긴다. 이때 Mod[footnote]c/c++에서는 %연산자를 이용한다.[/footnote]를 사용하면 편리하다.
(출처 : http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'다각형면적구하기[vbnet] Type tPoint X As Double Y As Double End Type Function PolygonArea(N As Integer, Points() As tPoint) As Double Dim i As Integer, j As Integer Dim area As Double area = 0 For i = 0 To N - 1 j = (i + 1) Mod N area = area + Points(i).X * Points(j).Y - Points(j).X * Points(i).Y Next i PolygonArea = area / 2 End Function |
형변환 연산자
점은 위치 벡터로 해석할 수 있다. 곧 점과 벡터는 서로 밀접한 관련이 있다. 표현되는 형식도 비슷하다. 이를 코드에서 어떻게 표현할 것인가가 문제였다. 형변환 연산자를 정의하므로 해결할 수 있었다.
형변환 연산자를 정의해 놓으면, 자동으로 형을 변환하여 계산하게 된다. 이야호!
아래의 내용은 점을 벡터로 확대변환을 하는 것이다. 이로써 인자를 벡터로 받는 곳에 그냥 점을 넘겨줘도 자동으로 형이 변환된다.
1 2 3 |
Public Shared Widening Operator CType(ByVal p As Point3D) As Vector3D Return New Vector3D(p.X, p.Y, p.Z) End Operator |
변환 프로시저에서 Widening 외에 Public Shared도 지정해야 한다.
확대 변환은 런타임에 항상 성공하며 데이터 손실이 없다. Single을 Double로 변환하거나 Char를 String으로 변환하거나 파생된 형식을 해당 기본 형식으로 변환하는 예를 들 수 있다. 파생된 형식에는 기본 형식의 모든 멤버가 포함되어 기본 형식의 인스턴스가 되므로 파생된 형식을 해당 기본 형식으로 변환하는 것은 확대 변환이다.
Option Strict가 On으로 설정되어 있는 경우에도 사용하는 코드에서 확대 변환에 대해 CType을 사용할 필요가 없다.
화면의 스케일에 상관없이 항상 1 픽셀의 굵기로 선을 그리기
화면의 스케일에 따라 선의 굵기가 달라진다. 즉, 확대 혹은 축소하는 과정에서 선의 굵기가 달라지게 된다. 이를 방지하기 위해서는 선의 굵기를 ‘-1’로 설정한다. 그러면 항상 1 픽셀의 굵기로 선을 그릴 수 있다.
1 |
Dim myPen As Drawing.Pen = New Drawing.Pen(System.Drawing.Color.Blue, -1) |
부울 변수의 변환
Visual Basic에서 숫자 데이터 형식 값을 Boolean으로 변환하는 경우 0은 False가 되고 다른 모든 값은 True가 된다. Visual Basic에서 Boolean 값을 숫자 값으로 변환하는 경우 False는 0이 되고 True는 -1이 된다. 반면에 C/C++ 또는 Java는 True값을 1로 하기에 바로 수식 계산에 이용할 수 있다. 다른 언어의 이와 같은 코드를 바로 옮기면 오류가 발생할 수 있다.
오일러의 공식
1 |
$e^{i pi} + 1 = 0$ |
이 식에는 e, $pi$, i, 1, 0이 모두 들어 있다.
소설, 영화 “박사가 사랑한 수식”에도 등장한다.
sky factor와 sky view factor
sky factor는 천공비로 번역할 수 있으며, sky-view factor는 천공형태계수 또는 천공률로 번역할 수 있다.
연산자 중복정의(operator overload)
VB2005는 VB2003과 달리 연산자 중복정의를 할 수 있다. 다음은 행렬계산에서 곱셈(*)에 대한 연산자 중복정의를 한 코드이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Public Shared Operator *(ByVal mA As Matrix3D, ByVal mB As Matrix3D) As Matrix3D Dim i, j As Short Dim mC As Matrix3D = New Matrix3D For i = 0 To 3 For j = 0 To 3 mC.Data(i, j) = (mA.Data(i,0)*mB.Data(0,j))+(mA.Data(i,1)*mB.Data(1,j)) _ + (mA.Data(i,2)*mB.Data(2,j))+(mA.Data(i,3)*mB.Data(3,j)) Next j Next i Return mC End Operator Public Shared Operator *(ByVal mA As Matrix3D, ByVal p1 As Point3D) As Point3D Dim p2 As Point3D = New Point3D() p2.X=(mA.Data(0,0)*p1.X)+(mA.Data(0,1)*p1.Y)+(mA.Data(0,2)*p1.Z)+(mA.Data(0,3)*1) p2.Y=(mA.Data(1,0)*p1.X)+(mA.Data(1,1)*p1.Y)+(mA.Data(1,2)*p1.Z)+(mA.Data(1,3)*1) p2.Z=(mA.Data(2,0)*p1.X)+(mA.Data(2,1)*p1.Y)+(mA.Data(2,2)*p1.Z)+(mA.Data(2,3)*1) Return p2 End Operator |
AutoCAD Release 12 DXF Format
AutoCAD R12의 DXF 형식에 대한 모든 설명이 있는 문서를 여기에서 찾을 수 있다.
더 많은 여러가지 정보는 여기에서 찾을 수 있다.
DXF, Revision 10