본문 바로가기

VBA

엑셀로 드래곤 커브 만들기


안녕하세요.

엑셀에서 드래곤 커브를 그려봤습니다.



네이버의 오늘의 과학에서 보고 만든 것입니다.

http://navercast.naver.com/science/math/1452

11월 10일에 게시된 내용입니다.


예전에 저 프랙탈의 모양을 보고 도대체 무슨 공식으로 저걸 만드는 것일까 궁금했는데 네이버의 오늘의 과학을 보고 깨달음을 얻었습니다.

네이버에서는 종이접기로 설명하고 있습니다. 위의 사진처럼 긴 종이를 반씩 접고 접어서 펼치기 입니다.

이론상으로는 매우 이해하기 좋은 것 같습니다. 그러나 엑셀상의 프로그램으로 구현하기에는 좀 복잡해집니다.

그래서 로직을 최초에 하나의 선이 있고 그 선은 원래 길이 만큼 길어지며 자신을 똑같이 복제하며 복제시작점에서 90도 꺽어지며 복제를 시작한다 로 바꾸어봤습니다.


위 그림 처럼 복제점마다 복제되는 다각화살표가 똑같이 복제되어 있습니다.


프로그래밍 단계입니다.

우선 사전정의로 방향을 일반수학에서 배우는 각으로 정의했습니다.


엑셀에서나 컴퓨터에서는 Y좌표가 위에서 내려갈수록 커집니다.

반면 수학에서 배우는 Y좌표는 밑에서 위로 올라갑니다. 이 부분은 그리기를 하는 부분에서 부호를 바꾸어서 적용시켰습니다.

처음 시작점에서의 각은 위의 복제단계 그림처럼 오른쪽으로 설정해주고 변수를 t(n)으로 정의합니다. 복제시 꺽어지는 각도도 그림처럼 +90도 방향으로 합니다.

수작업으로 수식화 시키기 위해 계산한 부분들입니다.


1단계 생성
t(1) = 0

2단계 생성
t(2) = t(1) + 90 = 0 + 90 = 90

3단계 생성
t(3) = t(2) + 90 = 90 + 90 = 180
t(4) = t(3) - t(2) + t(1) = 180 - 90 + 0 = 90

4단계 생성
t(5) = t(4) + 90 = 180
t(6) = t(5) - t(4) + t(3) = 180 - 90 + 180 = 270
t(7) = t(6) - t(3) + t(2) = 270 - 180 + 90 = 180
t(8) = t(6) - t(2) + t(1) = 180 - 90 + 0 = 90

n번째 복제를 할때 복제할 선의 수는 정확히 두배씩 늘어납니다.
그리고 복제의 첫 선은 무조건 앞의 선의 각도에 90도를 더해서 계산해주고
그 이후각은 이전각에서 복제대상각을 꺼구로 올라가면서 각차이를 반영해 줍니다.

기초 변수초기값 설정

    t(1) = 270
    k = 1
    시작 = 1
    종료 = 2

t(n)는 각 단계에서 각도를 저장해주기 위한 변수이고 k는 복제대상의 선을 따라가주는 역할을 합니다.
시작과 종료변수는 반복횟수를 정해줍니다.


    For j = 1 To 반복
        For i = 시작 + 1 To 종료
            If i = 시작 + 1 Then
                t(i) = (t(i - 1) + 90 + 360) Mod 360
            Else
                t(i) = (t(i - 1) + t(k - 1) - t(k) + 360) Mod 360
                k = k - 1
            End If
                       
        Next i
        시작 = 종료
        k = 종료
        종료 = 종료 * 2
       
    Next j

계산 루틴입니다. 매우 짧죠? 더 짧게 만들수 있을수도 있을것 같습니다.
반복이라는 변수는 몇번이나 복제를 할것인가의 경우입니다.
그리고 t(i)값을 계산하는데 있어서 360을 더해준다음 다시 360으로 나눈 나머지를 넣어줬습니다.
이것은 각도가 양수뿐만 아니라 음수도 나오고 양수도 720도 같은 쓸모없는 값이 나오기 때문입니다.
t(i)의 값은 0,90,180,270 만 들어가게 한것입니다.


이제 그리기 루틴입니다.

원래는 그리기를 엑셀상의 좌표를 이용해서 선으로 무수히 그려냈습니다. 가능하기는 한데 선이 중복되는 부분도 있고 끄트머리에서는 네모가 아닌 선으로 보이는 문제가 있었습니다.
그래서 엑셀에서 모든 좌표크기를 대략 정사각형정도로 만들고 축소해서 도트화 시켰습니다. 그리고 선이 움직이는 것을 도트가 움직이는 것으로 대체했습니다.


    목표점X = 200
    목표점Y = 100
   
    증감 = 1

    For j = 1 To 종료 / 2
       
        If Cells(목표점Y, 목표점X).Interior.Color = RGB(255, 255, 0) Then
            Cells(목표점Y, 목표점X).Interior.Color = RGB(255, 0, 0)
        Else
            Cells(목표점Y, 목표점X).Interior.Color = RGB(255, 255, 0)
        End If
        Select Case t(j)
            Case 0
                목표점X = 목표점X + 증감
            Case 90
                목표점Y = 목표점Y - 증감
            Case 180
                목표점X = 목표점X - 증감
            Case 270
                목표점Y = 목표점Y + 증감
        End Select
    Next j

이전 계산 루틴에서 종료변수에 두배씩 해주었는데 최종으로 처리된 두배값은 필요없으므로 2로 나누어 반복합니다.
목표점X, Y는 시행착오를 통해 맞춰주었습니다. 변경해도 되지만 좌표가 0 미만값이 나오게 되면 에러가 발생하게 됩니다.
For구문에서는 목표점마다 일단 색을 칠해 줍니다. 단순한 색도 좋지만 체크해보니 도형의 윤곽선에서는 지나가는 횟수가 한번만 발생되고 내부에서는 정확히 2번만 지나가게 됩니다.
그래서 처음 지나갈때는 노란색, 두번째 지나갈때는 빨간색으로 칠하게끔 해놨습니다.
그리고 t(j)값을 읽어들어 목표점의 좌표를 변경해줍니다. 아까 말씀드렸다시피 Y좌표의 방향이 일반수학과 반대이므로 90도와 270도의 경우 Y의 증감값 부호를 반대로 해주었습니다.
그리고 증감은 원래 선으로 그렸을때 있었던 변수였습니다. 선의 길이를 뜻한 것이었는데 그냥 지워버리지 않고 남겨뒀습니다.

전체소스는 파일은 다운받아 보시기 바랍니다.
2007용 파일과 2003이하용 파일이 있습니다. 다만 2003에서는 쉬트면적의 한계로 크기를 반으로 줄여놨습니다.

'VBA' 카테고리의 다른 글

인터넷에서 파일 다운받기  (0) 2010.06.14
엑셀에서 소리내기  (0) 2010.06.11
스도쿠 100개 풀기  (0) 2009.08.14
스도쿠 엑셀로 풀기  (3) 2009.08.14
파일을 휴지통에 넣기(API이용)  (0) 2009.08.12