학습과 프로그래밍을 위한 인용구

학습과 프로그래밍을 위한 인용구를 정리한 웹페이지입니다.

Quotations for Learning and Programming

몇 가지를 발췌하면 다음과 같다.

Programs must be written for people to read, and only incidentally for machines to execute.
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

If you can’t explain it simply, you don’t understand it well enough.
Simplicity is the soul of efficiency.

The best way to get a good idea is to get a lot of ideas.

The first C program

유닉스 운영체제(OS)와 C 프로그래밍 언어를 창시한 프로그래머 데니스 리치가 향년 70세로 눈을 감았다. 그를 기념하는 의미에서 아래의 이미지와 코드를 작성해 본다.

사용자 삽입 이미지

[c]#include

main()
{
printf(“hello, world\n”);
}
[/c]

To Dennis M. Ritchie

[c]#include

main()
{
printf(“Goodbye, World\n”);
}
[/c]

[관련 기사들]
유닉스-C언어의 아버지

[프로그램등록] Visual Air (software for psychrometic chart)

공기의 물리적인 상태값은 공기와 관련한 수치계산의 기본이 된다. 공조 설비에서 취급하는 공기는 습공기이기 때문에, 공기조화에 관한 계산은 습공기의 성질을 충분히 파악한 상태에서 가능하다. 이런 습공기의 상태값에는 밀도, 수증기압, 절대습도, 상대습도, 노점온도, 습구온도 등과 함께 습공기가 안고 있는 열량인 엔탈피가 있다.
습공기의 상태값은 표로 제시되기도 하지만, 모든 경우에 대한 자료를 주지 못한다. 이에 가장 기본적인 자료로서 습공기선도를 사용하게 되는데, 습공기의 상태값을 구하는데 사용됨과 동시에 공기조화 프로세스를 설계, 해석하는데도 사용된다.
따라서, 습공기에 대한 이론적인 것을 살펴보고, 상태값을 계산하는 함수와 함께 습공기선도를 그리는 함수를 작성하는 프로그램을 만들었다.
프로그램 제작은 사용자 인터페이스가 좋은 윈도우 환경에서 쓸 수 있게 Visual Basic 6.0 Professional Version으로 하였다.

사용자 삽입 이미지
Visual Air 실행 화면

이 프로그램에 대한 등록증은 아래와 같다.
사용자 삽입 이미지

Visual Studio .NET 2005에서 설치용 프로그램 만들기

프로그램을 개발한 다음, 사용자가 설치해서 사용할 수 있도록 하기 위해서는 ‘설치용 프로그램'(일명 setup 프로그램)을 만들어야 한다.
Visual Studio .NET 2005에서는 솔루션에 ‘설치 프로젝트’를 추가하여 개발 프로그램을 설치가능하게 할 수 있다.
다음의 사이트는 이것을 잘 설명하고 있다.
http://www.nohungry.net/tt1/tag/110

VB.NET Tutorial

Visual Basic .NET에 대한 설명서가 잘 정리된 웹페이지를 소개한다.
http://www.java2s.com/Tutorial/VB/CatalogVB.htm
키워드(keyword) 별로 어떻게 쓰이는지 알고 싶다면, 꼭 한 번 들를만 하다.
또한, 비주얼베이직 닷넷 말고 지구상에 존재하는 웬만한 프로그래밍 언어에 대한 설명서도 함께 있다. 여기서는 비주얼 베이직 닷넷만 연결해 놓은 것이다. 왜? 이 홈피의 주관심사여서. ^^

3차원 벡터(또는 점)에 대한 구조체(structure)

3차원 벡터(또는 점)에 대한 구조체(structure)를 아래와 같이 작성할 수 있다.
<특이점>
1) 벡터의 성분은 X, Y, Z로 명백하므로 그냥 Public 변수로 설정함
2) 배열로 선언된 벡터 성분과도 호환되도록 함
– VB.NET의 Default Property를 이용함
– 사용예 :

Dim v1,v2 As Vector3D
Dim innerProduct As Single = v1(0)*v2(0) + v1(1)*v2(1) + v1(2)*v2(2)

구조체 소스코드

Public Structure Vector3D
Public X, Y, Z As Single
Public Shared ReadOnly ZeroVector As Vector3D = New Vector3D(0, 0, 0)

#Region "Constructors"
'Private Sub New()
'Nothing -&gt; No default initialization
'End Sub
Public Sub New(ByVal x As Single, ByVal y As Single, ByVal z As Single)
Me.X = x
Me.Y = y
Me.Z = z
End Sub
Public Sub New(ByVal v As Vector3D)
Me.New(v.X, v.Y, v.Z) 'copy constructor
End Sub
#End Region

#Region "Properties"
'''

''' 배열로 선언된 벡터 성분과 호환이 되도록 작성함
'''

'''성분의 위치를 지정하는 값 0:x, 1:y, 2:z ''' 해당성분의 값
''' 해당성분의 값
'''
''' 왜 호환되게 했나고요?
''' c/c++로 짠 코드를 변환하다 보면, 배열로 간단하게 해결한 것들이 많아서요.
'''
Default Public Property Elements(ByVal index As Short) As Single
Get
Dim i As Short = index Mod 3'실수를 방지하기 위해서
Select Case i
Case 0
Return X
Case 1
Return Y
Case 2
Return Z
End Select
End Get
Set(ByVal value As Single)
Dim i As Short = index Mod 3
Select Case i
Case 0
X = value
Case 1
Y = value
Case 2
Z = value
End Select
End Set
End Property
#End Region
''각종 Property와 Operator 등은 생략 ^^
End Class

Intersection with a ray and an AABB

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

[vbnet]Function IntersectionAABBonText(ByVal RayDirection As Vector3D, ByVal RayOrigin As Vector3D) As Boolean
Dim RayInsideAABB As Boolean = True
Dim HitPoint As Vector3D
Dim MaxT As New Vector3D(-1.0F, -1.0F, -1.0F)
Dim Epsilon As Single = 0.00001F

‘Find the x component
If (RayOrigin.X < Me.m_Min.X) Then HitPoint.X = Me.m_Min.X RayInsideAABB = False If RayDirection.X <> 0.0F Then
MaxT.X = (Me.m_Min.X – RayOrigin.X) / RayDirection.X
End If
ElseIf (RayOrigin.X < Me.m_Max.X) Then HitPoint.X = Me.m_Max.X RayInsideAABB = False If RayDirection.X <> 0.0F Then
MaxT.X = (Me.m_Max.X – RayOrigin.X) / RayDirection.X
End If
End If
‘Find the y component
If (RayOrigin.Y < Me.m_Min.Y) Then HitPoint.Y = Me.m_Min.Y RayInsideAABB = False If RayDirection.Y <> 0.0F Then
MaxT.Y = (Me.m_Min.Y – RayOrigin.Y) / RayDirection.Y
End If
ElseIf (RayOrigin.Y > Me.m_Max.Y) Then
HitPoint.Y = Me.m_Max.Y
RayInsideAABB = False
If RayDirection.Y <> 0.0F Then
MaxT.Y = (Me.m_Max.Y – RayOrigin.Y) / RayDirection.Y
End If
End If
‘Find the z component
If (RayOrigin.Z < Me.m_Min.Z) Then HitPoint.Z = Me.m_Min.Z RayInsideAABB = False If RayDirection.Z <> 0.0F Then
MaxT.Z = (Me.m_Min.Z – RayOrigin.Z) / RayDirection.Z
End If
ElseIf (RayOrigin.Z > Me.m_Max.Z) Then
HitPoint.Z = Me.m_Max.Z
RayInsideAABB = False
If RayDirection.Z <> 0.0F Then
MaxT.Z = (Me.m_Max.Z – RayOrigin.Z) / RayDirection.Z
End If
End If

‘—- Ray origin inside bounding box
‘광선의 시점이 박스 안에 있다. 이 판단이 내 프로그램에서 유용할 것인가?
‘내 프로그램은 기본적으로 3D Face이기 때문에 정확한 판단이 아닐 수도 있다.
If RayInsideAABB Then
HitPoint = RayOrigin
Return True
End If

‘—- Get largest of the maxT’s for final choice of intersection
‘최대값 구하기
Dim nPlane As Integer = 0
If (MaxT.Y > MaxT(nPlane)) Then nPlane = 1
If (MaxT.Z > MaxT(nPlane)) Then nPlane = 2

‘—- Check final candidate actually inside box
If (MaxT(nPlane) < 0.0F) Then Return False If nPlane <> 0 Then
HitPoint.X = RayOrigin.X + MaxT.X * RayDirection.X
If (HitPoint.X < Me.m_Min.X - Epsilon) OrElse (HitPoint.X > Me.m_Max.X + Epsilon) Then
Return False
End If
End If
If nPlane <> 1 Then
HitPoint.Y = RayOrigin.Y + MaxT.Y * RayDirection.Y
If (HitPoint.Y < Me.m_Min.Y - Epsilon) OrElse (HitPoint.Y > Me.m_Max.Y + Epsilon) Then
Return False
End If
End If
If nPlane <> 2 Then
HitPoint.Z = RayOrigin.Z + MaxT.Z * RayDirection.Z
If (HitPoint.Z < Me.m_Min.Z - Epsilon) OrElse (HitPoint.Z > Me.m_Max.Z + Epsilon) Then
Return False
End If
End If
Return True
End Function[/vbnet]

[Webpage]3D Object Intersection

3D Object Intersection

3차원 객체들의 교차(혹은 충돌)여부를 검사하는 것은 그래픽관련 프로그래밍할 때, 매우 빈번하게 접하는 문제이다.
이런 문제들을 한 자리에 일목요연하게 정리한 웹페이지이다.
위치 : http://www.realtimerendering.com/int/
자체 설명
This page gives a grid of intersection routines for various popular
objects, pointing to resources
in books and on the web. For a unified static and dynamic object
intersection and distance library (non-commercial use only, though),
see
the TGS collision system. The most comprehensive books on the subject are Geometric Tools for Computer Graphics (GTCG) and Real-Time Collision Detection (RTCD); the former is all-encompassing, the latter more approachable and focused.

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

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

1)DLL 함수 선언

Public Declare Function GetInputState Lib "user32" () As Int32

2)함수 사용

If Not GetInputState() = 0 Then Application.DoEvents()

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