기본 콘텐츠로 건너뛰기

1월, 2010의 게시물 표시

두 선의 교차점 구하기

참고 자료 : http://mathworld.wolfram.com/Line-LineIntersection.html   이 글은 두 선분의 교차점을 구하는 알고리즘이 작업에 필요해서 작성해둔 글이다. 참고로, 예전에 두선분의 교차점을 구하는 것 자체가 쉬울 것으로 생각하고 흔히 생각하는 기울기, y 절편을 이용하여 접근하려고 하였다. 이는 상당히 비효율적 방법이였고 조금 더 효율적인 방법으로 접근하였다. 먼저 직선의 방정식으로써, 기울기와 절편으로 나타내지 말고, t 매개변수를 이용해 나타내면 다음과 같다. P1과 P2는 직선의 시작점과 끝점을 나타내며, t의 범위는 0에서 1까지이다. (P1, P2에서 1, 2는 아래첨자로 생각하기 바란다) 선의 식을 알았으니, 이제 두선의 교점을 구해보는 것으로 응용해보자. 먼저 아래 그림을 보자. Line1은 P1과 P2로 이루어져 있으며, Line2는 P3와 P4로 이루어져 있다. 두개의 라인을 식으로 표현해보면 다음과 같다. 이미 알겠지만, t와 s는 0에서 1부터의 값이며, 두선의 교점은 두선의 공통된 값이므로 P(t)와 P(s)는 같으므로 위의 2개의 식은 아래의 1개의 식으로 나타낼 수 있다. 다시 위의 식을 x, y로 분리해보면 아래와 같은 두개의 식들로 분리된다. 위의 식을 t와 s에 대해서 정리를 해보면 다음과 같다. 즉, 위의 t와 s는 두선이 서로 만날때의 값이므로, 최종적으로 두선의 교점은 다음과 같이 나타낼 수 있다. 위의 x, y가 우리가 구하고자하는 두 직선의 교점이다. 마지막으로 t와 s에 대해 정리해 보도록 하자. s와 t의 값이 0과 1 사이를 벗어나는 경우, 두 선은 교차하지 않는다고 판정해야 한다. 그리고 s와 t를 구하는 공식에서 분모가 0인 경우 두 선은 평행하다는 의미이므로 교점은 존재하지 않다. 분모와 분자 모두 0인 경우 두 선은 동일한 선이다. 아래의 코드는 위의 설명을 토대로 작성하였다.   [code cpp] bool GetInter

평면상의 세 점으로부터 평면의 방정식 구하기

평면의 방정식은 아래처럼 기술할 수 있으며, (A, B, C)는 평면에 대한 법선(수직) 백터이고.. D는 이 법선 백터의 길이(크기)입니다. (x,y,z)는 평면상의 임이의 점입니다. 평면은 최소한 점 3개가 정해지면 평면의 방정식이 명확히 정의됩니다. 즉, 평면 상의 (x1,y1,z1)과 (x2, y2, z2) 그리고 (x3, y3, z3)가 정해지면 위의 공식에서 A, B, C, D의 값이 정해진다는 의미입니다. 각 A,B,C,D는 정해진 점들에 대해서 다음과 같은 행렬식으로 정의되며... 위의 행렬식은 다음과 같이 다시 한번 전개가 됩니다. 결국 이렇게 구한 A,B,C,D로부터 평면의 방정식이 결정되게 됩니다.     출처 : http://www.gisdeveloper.co.kr/456

유클리드의 원론(Elements)과 비유클리드 기하학.

유클리드의 원론(Elements) 는 한마디로 학교에서 우리가 배우고 있는 수학 교과서의 원본이라고 할 수 있습니다. 실제로 유럽에서는 19세기까지 원론을 번역하여 그대로 교과서로 썼습니다. 세계에서 두번째로 많이 발행된 책이라고도 합니다.(첫번째는 성경)   원론은 당시 (고대 그리스)의 수학을 집대성하였다고 할 수 있는데 기본적인 가정 (공리, 공준) 으로부터 출발하여 차근차근 명제들을 증명해나가는 방법으로 전개 되고 있으며 그것이 이후의 수학 책들의 모델이 되었습니다. (그것이 수학 책이 재미 없는 이유이기도 합니다.) 유클리드는 기원전 300 년 경의 사람으로 생각되고 있습니다. 원론은 모두 13권으로 되어 있습니다.     원론의 제 1 권 앞부분의 내용을 발췌해서 옮겨보겠습니다. 머리말은 없습니다..   정의(23개) 1 . 점은 부분이 없는 것이다. 2 . 선은 폭이 없는 길이이다. 3 . 선의 끝은 점이다. 4 . 직선이란, 그 위의 점에 대해 한결같이 늘어선 선이다. 5 . 면이란 길이와 폭만을 갖는 것이다. 6 . 면의 끝은 선이다. 7 . 평면이란 면이며 직선이 그 위에 한결같이 놓인 것이다. 8 . 평면각이란 한 평면 위에서 서로 만나고 일직선이 되지 않는     두 선 사이의 기울기이다. 9 . 각을 낀 두 선분이 직선이면 그 각을 직선각이라 한다. 10. 한 직선이 다른 직선과 만났을 때 이루어지는 이웃한 두 각이 서로     같으면, 같은 각을 각각 직각이라고 하고, 이 때 한 직선을 다른 직선에     대하여 수직이라고 한다. 11. 둔각이란 직각보다 큰 각이다. 12. 예각이란 직각보다 작은 각이다. 13. 어떤 것의 끝을 경계라 한다. 14. 도형이란 하나 또는 그 이상의 경계에 의해 둘러싸인 것이다. 15. 원이란 그 도형의 내부에 있는 한 정점으로부터 곡선에 이르는 거리가     똑같은 하나의 곡선에 의해 둘러싸인 평면도형이다. 16. 그리고 이 정점을 원의 중심이

장기 이동 방향 검사

종이를 몇번 접을 수 있을까?

1. 종이를 9번 이상 접을 수 없는 이유 두 가지 원인이 있습니다. 첫 번째는 종이의 두께가 늘어나기 때문입니다. 두 번째는 종이의 넓이가 줄어들기 때문입니다. 먼저 두께의 변화를 살펴 보면, 1번 접으면 두께가 두배씩 늘어나죠. 두께를 0.1mm 라고 할 때, 0번 접으면 : 0.1 1번 접으면 : 0.2 2번 접으면 : 0.4 3번 접으면 : 0.8 4번 접으면 : 1.6 5번 접으면 : 3.2 6번 접으면 : 6.4 7번 접으면 : 12.8 8번 접으면 : 25.6 9번 접으면 : 51.2 즉 9번을 접으면 원래 두께의 512배가 되는 것입니다.. 다음으로 넓이를 살펴 봅시다. 1번을 접으면 넓이는 반으로 줄어들게 됩니다. 초기 넓이를 512제곱센티미터라고 하면. 0번 접으면 : 512 1번 접으면 : 256 2번 접으면 : 128 3번 접으면 : 64 4번 접으면 : 32 5번 접으면 : 16 6번 접으면 : 8 7번 접으면 : 4 8번 접으면 : 2 9번 접으면 : 1 즉 9번을 접으면.. 초기 넓이의 1/512 로 줄게 되는 것입니다. 이론적으로 넓이는 위처럼 줄어 들겠지만, 실제로 종이접기에는 종이 높이 만큼의 길이가 추가 되어 줄어드는 넓이는 더 많게 됩니다.   출처 : http://kin.naver.com/open100/detail.nhn?d1id=11&dirId=1113&docId=149404       2. 종이를 26번 접을수 있다면 그 높이는 에베레스트산 아시는 분도 있으시겠지만  만약에 종이를 26번 접을수 있다면 그 높이는 에베레스트산 정도의 높이가 됩니다 뻥이라 생각 하시겠죠??그렇지만 사실입니다. 우리가 주위에서 하찮게 생각했던것들 자세히 알고보면 어마어마 하고 크죠 제가 확인 시켜드리기 위해서 계산을 해보죠 종이를 한번 접으면 2장 돼는거 아시죠?/ 두번 접으면 4장 세번 접으면 8장 네번 접으면 16장 다섯번 접으면 32장

[Paper]Colour Space Conversions

coloureq.pdf Title: Colour Space Conversions   author: Adrian Ford ( ajoec1@wmin.ac.uk <defunct>) and Alan Roberts ( Alan.Roberts@rd.bbc.co.uk ).   August 11, 1998(b)   src: http://www.poynton.com/PDFs/coloureq.pdf

[스크랩]스크린 해상도

윈도우 상에서 시간 측정하기

이 글은 마이크로소프트웨어 99 년 2 월의 " 이보다 더 정확할 순 없다 ! 윈도우 환경에서 시간측정하는법 " 이란 기사에서 참고한 것입니다 .   윈도우 상에서 시간 측정하기     윈도우 상에서 시간을 측정하기 위한 방법에는 몇가지가 있는데 , clock() 함수를 사용하거나 WM_TIMER 메시지를 사용한다거나 , 일반 타이머보다 더 높은 정확도를 위해 멀티미디어 타이머를 사용할 수 있다 . clock() 함수를 사용하는 방법은 "C/C++ 관련 내용 " 의 " 정렬 (Sort)" 부분에서 볼 수 있다 . WM_TIMER 의 경우는 초당 클럭수가 18.3 이므로 1/18.3 즉 , 약 55 ms 정도의 정확도를 가진다 . 그리고 멀티미디어 타이머의 경우는 최소시간 간격이 1ms 이고 , 10ms 이내의 이벤트 지연시간을 가지는 타이머 이벤트는 CPU 자원을 많이 소모하기 때문에 주의해야 한다 . 앞서 설명한 멀티미디어 타이머는 최소 시간간격이 1ms 로 , 그 이하의 시간을 측정하는데는 적합하지 않다 . 더구나 CPU 의 성능이 높아지면서 1ms 는 무척 긴 시간이 돼 버렸다 . 1ms 동안 많은 명령을 수행할 수 있기 때문에 네트웍 패킷의 전송시간이나 특정 루틴의 시간을 측정하기 위해서는 멀티미디어 타이머는 도움이 되지 않는다 . 이러한 경우에 Win32 API 에서 제공하는 QueryPerformanceFrequency 와 QueryPerformanceCounter , 이 두 개의 함수가 유용하게 쓰인다 .  QueryPerformanceFrequency 는 1 초 동안 카운터가 증가하는 값을 얻어내는데 , 시스템이 이 두 함수들을 지원하지 않으면 QueryPerformanceFrequency 의 값이 0 이 되고 결과값도 0 이 돌아온다 . 다음 코드는 VC++ 에서 카운터를 사용한 예이다 . //------------

Pseudo Color 변환

Pseudo color(유사 색상) :  색이 없는 자료에 색을 부여하는 색 정합. 온도 표현을 위해 사용된다. 영상에서 낮은 온도는 푸른색으로 표현된다. 높은 온도는 붉은색으로 표현된다.                 Original                             Pseudo Color       흑백값에 따른 칼러 분포     C 에서 구현  math.h 를 이용하여 C 에서 삼각함수를 구현할 수 있다 그러나 삼각함수에 입력되는 값은 라디안 단위로 변화시켜야 한다(X°*π/180) Blue 값은 sin 함수 Red 값은 -sin 함수  Green 값은 -cos 함수   Y(흑백영상 값)의 범위는 0부터 255까지이고 사인,코사인함수의 주기(D)는 0°부터 360°이다                           이를 수식적으로 표현하면, Y : D = 256 : 360   라디안 단위로 변화시키면,                             삼각함수의 값(X)이 -1에서 1까지의 값을 가진다 이것을 0부터 255까지 대칭시키면, -1이 0, 0이 128, +1이 255값을 가져야 한다.   삼각함수의 값에 1을 더한후 127.5를 곱한다   구르는 돌에는 이끼가 끼지 않는다 | wjddyd0505 http://blog.naver.com/wjddyd0505/120019412100 ////////////////////////////////////////////////////////////////////////////////////////////     아래는 위 자료를 바탕으로 작성된 Pseudo color 변환 예 입니다. OpenCV 사용.     원본                                                            변환 후  

Line-Line Intersection

Geometry  > Line Geometry  > Lines  > Geometry  > Line Geometry  > Concurrence  > MathWorld Contributors  > Pegg  > Interactive Entries  > Interactive Demonstrations  > Line-Line Intersection The intersection of two lines and in two dimensions with, containing the points and , and containing the points and , is given by (1) (2) where denotes a determinant . This corresponds to simultaneously solving (3) (4) for and . Other treatments are given by Antonio (1992) and Hill (1994). The intersections of two lines given in trilinear coordinates as (5) (6) is (7) Pseudocode for segment intersection is given by de Berg et al. (2000). Three lines in trilinear coordinates (8) (9) (10) concur if their trilinear coordinates satisfy (11) in which c