Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

C# - 피보나치 수열의 사각형과 황금 나선(Golden spiral) 그리기


지난번 펜타그램에 이어서. ^^

C# - 펜타그램(Pentagram) 그리기
; https://www.sysnet.pe.kr/2/0/1310

피보나치 수의 재미있는 특성 하나를 기하학으로 살펴보겠습니다.

인접한 피보나치 수들의 곱을 홀수 번 더하면 마지막 피보나치 수의 제곱과 같다.

수식으로 표현하면 다음과 같은데요.

1 * 1 + 1 * 2 + 2 * 3 == 9, 마지막 수(3)의 제곱

1 * 1 + 1 * 2 + 2 * 3 + 3 * 5 + 5 * 8 + 8 * 13 + 13 * 21 == 441, 마지막 수(21)의 제곱

1 * 1 + 1 * 2 + 2 * 3 + 3 * 5 + 5 * 8 + 8 * 13 + 13 * 21 + 21 * 34 + 34 * 55 + 55 * 89 + 89 * 144 == 144 * 144

위의 특성을 그림으로 표현하기 위해 피보나치 수열을 구하고,

public class Fibonacci
{
    int first = 0;
    int second = 1;

    public IEnumerable<int> GetNext()
    {
        while (true)
        {
            int result = first + second;
            first = second;
            second = result;

            yield return result;
        }
    }
}

이를 기반으로 각각 Width, Height 값으로 사각형 크기를 구성하고,

public class FibonacciSize
{
    Size size;

    public FibonacciSize()
    {
        size = new Size();
        size.Height = 0;
        size.Width = 1;
    }

    public IEnumerable<Size> GetNext()
    {
        Fibonacci fib = new Fibonacci();
        foreach (var item in fib.GetNext())
        {
            int temp = size.Width + size.Height;

            size.Height = size.Width;
            size.Width = temp;

            yield return size;
        }
    }
}

상하좌우로 뻗어나가는 사각형을 그려주면 다음과 같이 홀 수개의 사각형마다 정사각형을 이루는 것을 보게 되고, 정사각형의 크기(n * n = n제곱)를 구하는 값과 같아지게 되는 것입니다.

golden_spiral_1.png

재미 삼아서, 해당 사각형마다 '호'를 그려서 표현하면 다음과 같이 나옵니다.

golden_spiral_2.png




황금나선은, 위의 피보나치 수열을 이용한 사각형과 유사합니다. 단지 정사각형만 피보나치 수열값만큼 증가시켜 주면서 그려나가면 됩니다.

private void DrawGoldenSpiral(Graphics g)
{
    SpiralForwrad fd = new SpiralForwrad();
    IEnumerator<SpiralDirection> rectForward = fd.GetNext().GetEnumerator();

    Fibonacci fib = new Fibonacci();
    fib.GetNext();
    Rect prev = new Rect();

    foreach (var item in fib.GetNext())
    {
        rectForward.MoveNext();
        SpiralDirection sdirection = rectForward.Current;

        Rect current = new Rect();

        switch (sdirection)
        {
            case SpiralDirection.Top:
                current = new Rect(prev.X, prev.Y - item, item, item);
                break;

            case SpiralDirection.Left:
                current = new Rect(prev.X - item, prev.Y, item, item);
                break;

            case SpiralDirection.Bottom:
                current = new Rect(prev.X, prev.Bottom, item, item);
                break;

            case SpiralDirection.Right:
                current = new Rect(prev.Right, prev.Y, item, item);
                break;
        }

        prev.Plus(current);
        Rectangle drawRect = ToCartesian(current);

        if (this.ClientRectangle.Contains(drawRect) == false)
        {
            break;
        }

        g.DrawRectangle(Pens.Blue, drawRect);
    }
}

golden_spiral_3.png

비록 피보나치 수열로 퍼지는 방향으로 사각형을 그리긴 했지만, 모니터의 픽셀 좌표를 무시하고 상상으로 무한히 황금비의 직사각형을 내부에 그려나갈 수 있으므로 결코 다다를 수 없는 '점'으로 수렴하게 되는데요. 이러한 특성을 '클리퍼드 피코버(Clifford Alan Pickover, 1957~)'라는 수학자는 '신의 눈'으로 명칭했다고 합니다.

황금 나선은 이렇게 그려진 정사각형들의 호를 이어서 그려주면 됩니다.

golden_spiral_4.png

첨부된 소스 코드에는 위의 2가지 코드가 들어 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/27/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11895정성태5/12/201922555.NET Framework: 832. ML.NET Model Builder - 회귀(Regression), 다중 분류(Multi-class classification) 예제파일 다운로드1
11894정성태5/10/201924518VS.NET IDE: 135. Visual Studio - ML.NET Model Builder 소개 [5]
11893정성태5/10/201920584오류 유형: 535. C# 6.0 이상의 문법을 컴파일 시 오류가 발생한다면?
11892정성태5/10/201920494웹: 38. HTTP Cookie의 expires 시간 형식(RFC7231)
11891정성태5/9/201923621.NET Framework: 831. (번역글) .NET Internals Cookbook Part 12 - Memory structure, attributes, handles
11890정성태5/8/201919279개발 환경 구성: 439. "Visual Studio Enterprise is required to execute the test." 메시지와 관련된 코드 기록
11889정성태5/8/201919320개발 환경 구성: 438. mstest, QTAgent의 로그 파일 설정 방법
11888정성태5/8/201937230.NET Framework: 830. C# - 비동기 호출을 취소하는 CancellationToken의 간단한 예제 코드 [1]파일 다운로드1
11887정성태5/8/201923069.NET Framework: 829. C# - yield 문을 사용할 수 있는 메서드의 조건
11886정성태5/7/201920124오류 유형: 534. mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류 [2]
11885정성태5/7/201917600오류 유형: 533. mstest.exe 실행 시 "File extension specified '.loadtest' is not a valid test extension." 오류 발생
11884정성태5/5/201922513.NET Framework: 828. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 - 두 번째 이야기
11883정성태5/3/201927517.NET Framework: 827. C# - 인터넷 시간 서버로부터 받은 시간을 윈도우에 적용하는 방법파일 다운로드1
11882정성태5/2/201923979.NET Framework: 826. (번역글) .NET Internals Cookbook Part 11 - Various C# riddles파일 다운로드1
11881정성태4/28/201924083오류 유형: 532. .NET Core 프로젝트로 마이그레이션 시 "CS0579 Duplicate 'System.Reflection.AssemblyCompanyAttribute' attribute" 오류 발생
11880정성태4/25/201919832오류 유형: 531. 이벤트 로그 오류 - Task Scheduling Error: m->NextScheduledSPRetry 1547, m->NextScheduledEvent 1547
11879정성태4/24/201928747.NET Framework: 825. (번역글) .NET Internals Cookbook Part 10 - Threads, Tasks, asynchronous code and others파일 다운로드2
11878정성태4/22/201924007.NET Framework: 824. (번역글) .NET Internals Cookbook Part 9 - Finalizers, queues, card tables and other GC stuff파일 다운로드1
11877정성태4/22/201924221.NET Framework: 823. (번역글) .NET Internals Cookbook Part 8 - C# gotchas파일 다운로드1
11876정성태4/21/201922497.NET Framework: 822. (번역글) .NET Internals Cookbook Part 7 - Word tearing, locking and others파일 다운로드1
11875정성태4/21/201924316오류 유형: 530. Visual Studo에서 .NET Core 프로젝트를 열 때 "One or more errors occurred." 오류 발생
11874정성태4/20/201924340.NET Framework: 821. (번역글) .NET Internals Cookbook Part 6 - Object internals파일 다운로드1
11873정성태4/19/201923015.NET Framework: 820. (번역글) .NET Internals Cookbook Part 5 - Methods, parameters, modifiers파일 다운로드1
11872정성태4/17/201923902.NET Framework: 819. (번역글) .NET Internals Cookbook Part 4 - Type members파일 다운로드1
11871정성태4/16/201921794.NET Framework: 818. (번역글) .NET Internals Cookbook Part 3 - Initialization tricks [3]파일 다운로드1
11870정성태4/16/201920681.NET Framework: 817. Process.Start로 실행한 콘솔 프로그램의 출력 결과를 얻는 방법파일 다운로드1
... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...