문제

나는 프랙탈 프로그래밍에 대한 경험이 없습니다.물론 나는 유명한 만델브로트의 이미지 등을 본 적이 있다.

프랙탈에 대한 간단한 알고리즘을 알려주실 수 있나요?

프로그래밍 언어는 실제로 중요하지 않지만 액션스크립트, C#, Java에 가장 익숙합니다.

프랙탈을 검색하면 많은 (복잡한) 정보를 얻을 수 있다는 것을 알고 있지만 간단한 알고리즘부터 시작해서 가지고 놀고 싶습니다.

어떻게 하면 사랑스러운 색상으로 만들 수 있는지 등 기본 알고리즘을 개선하기 위한 제안도 환영합니다.

도움이 되었습니까?

해결책

만델 브로트를 프로그래밍하는 것은 쉽습니다.
내 빠른 코드는 아래에 있습니다 (버그가없는 것이 아니라 좋은 개요).

개요는 다음과 같습니다. 만델 브로트 세트는 반경 2가있는 원 안에 완전히 복잡한 그리드에 있습니다.

따라서 직사각형 영역의 모든 지점을 스캔하여 시작하십시오. 각 점은 복소수 (x + yi)를 나타냅니다. 해당 복소 번호를 반복하십시오.

[new value] = [old-value]^2 + [original-value] 두 가지를 추적하는 동안 :

1.) 반복 횟수

2.) 원점에서 [새로운 가치]의 거리는.

최대 반복 수에 도달하면 완료되었습니다. 원점으로부터의 거리는 2보다 큰 경우 완료됩니다.

완료되면 수행 한 반복 수에 따라 원래 픽셀을 색칠하십시오. 그런 다음 다음 픽셀로 이동하십시오.

    public void MBrot()
    {
        float epsilon = 0.0001; // The step size across the X and Y axis
        float x;
        float y;
        int maxIterations = 10; // increasing this will give you a more detailed fractal
        int maxColors = 256; // Change as appropriate for your display.

        Complex Z;
        Complex C;
        int iterations;
        for(x=-2; x<=2; x+= epsilon)
        {
            for(y=-2; y<=2; y+= epsilon)
            {
                iterations = 0;
                C = new Complex(x, y);
                Z = new Complex(0,0);
                while(Complex.Abs(Z) < 2 && iterations < maxIterations)
                {
                    Z = Z*Z + C;
                    iterations++;
                }
                Screen.Plot(x,y, iterations % maxColors); // depending on the number of iterations, color a pixel.
            }
        }
    }

외식하는 일부 세부 사항은 다음과 같습니다.

1.) 복소수의 정사각형과 계산 방법을 정확히 배우십시오.

2.) (-2,2) 직사각형 영역을 스크린 좌표로 번역하는 방법을 알아냅니다.

다른 팁

실제로 시작해야 할 것은 만델브로 집합, 그것이 실제로 무엇인지 이해하십시오.

그 뒤에 있는 아이디어는 비교적 간단합니다.복소변수 함수로 시작합니다.

f(z) = z2 + 씨

여기서 z는 복소수입니다. 변하기 쉬운 그리고 C는 복합물이다 끊임없는.이제 z = 0부터 시작하여 반복합니다. 즉,당신은 z를 계산합니다1 = f(0), z2 = f(z1), z3 = f(z2) 등등.시퀀스 z에 대한 상수 C의 집합1, z2, z3, ...~이다 제한된, 즉.무한대로 가지 않는 것은 Mandelbrot 집합(Wikipedia 페이지 그림의 검은색 집합)입니다.

실제로 만델브로 집합을 그리려면 다음을 수행해야 합니다.

  • 복소 평면에서 직사각형을 선택합니다(예: -2-2i 지점에서 2+2i 지점까지).
  • 모니터의 픽셀에 매핑될 적절한 직사각형 포인트 그리드(예: 400x400 포인트)로 직사각형을 덮습니다.
  • 각 포인트/픽셀에 대해 C를 해당 포인트로 두고, 예를 들어 해당 반복 시퀀스 z의 20개 항을 계산합니다.1, z2, z3, ...그리고 그것이 "무한대로 가는지" 확인해보세요.실제로 반복하는 동안 20개의 항 중 하나의 절대값이 2보다 큰지 확인할 수 있습니다(항 중 하나가 그렇다면 후속 항은 무제한임이 보장됩니다).일부 z_k가 그렇다면 시퀀스는 "무한대로 이동"합니다.그렇지 않으면 제한된 것으로 간주할 수 있습니다.
  • 특정 점 C에 해당하는 시퀀스가 ​​​​제한되어 있으면 그림에 해당 픽셀을 검은색으로 그립니다(만델브로 집합에 속하기 때문입니다).그렇지 않으면 다른 색상으로 그립니다.재미있게 그리고 예쁜 플롯을 만들고 싶다면 ABS(20번째 항)의 크기에 따라 다른 색상으로 그려보세요.

프랙탈에 대한 놀라운 사실은 우리가 엄청나게 복잡한 집합(특히, 국경 지방 Mandelbrot 집합의) 쉽고 명백하게 무해한 요구 사항으로부터.

즐기다!

복소수가 골칫거리라면 L 시스템을 사용하여 공식화할 수 있는 다양한 도형이 있습니다.이를 위해서는 상호 작용하는 두 개의 레이어가 필요하지만 각 레이어는 그 자체로 흥미롭습니다.

먼저 거북이가 필요합니다.앞으로, 뒤로, 왼쪽, 오른쪽, 펜업, 펜다운.L 시스템을 구동하지 않고도 거북이 형상을 사용하여 거북이 그래픽으로 만들 수 있는 재미있는 모양이 많이 있습니다."로고 그래픽" 또는 "거북이 그래픽"을 검색하세요.전체 심벌 마크 시스템은 실제로 리스프 괄호가 없는 프로그래밍 환경 캠브리지 폴란드어 통사론.그러나 거북이 개념을 사용하여 예쁜 사진을 얻기 위해 그렇게 멀리 갈 필요는 없습니다.

그런 다음 L-시스템을 실행하려면 레이어가 필요합니다.L-시스템은 다음과 관련이 있습니다. 포스트 시스템 그리고 세미목 시스템, virii와 마찬가지로 Turing Completeness의 경계에 걸쳐 있습니다.컨셉은 문자열 재작성.이는 매크로 확장이나 재귀를 제한하기 위한 추가 컨트롤이 포함된 프로시저 세트로 구현될 수 있습니다.아래 예와 같이 매크로 확장을 사용하는 경우에도 기호를 거북이 명령에 매핑하기 위한 프로시저 세트와 인코딩된 거북이 프로그램을 실행하기 위해 문자열이나 배열을 반복하는 프로시저가 필요합니다.제한된 재귀 프로시저 세트의 경우(예.), 프로시저에 거북이 명령을 포함하고 각 프로시저에 재귀 수준 검사를 추가하거나 이를 핸들러 함수로 분해합니다.

다음은 매크로 확장과 매우 ​​축약된 거북이 명령 세트를 사용하는 포스트스크립트의 피타고라스 트리의 예입니다.Python과 Mathematica의 몇 가지 예를 보려면 내 문서를 참조하세요. 코드 골프 챌린지.

ps l-system pythagoras tree luser-droog

훌륭한 책이 있습니다 혼돈과 프랙탈 각 장의 끝에 간단한 예제 코드가있어 일부 프랙탈 또는 다른 예제를 구현합니다. 오래 전에 그 책을 읽었을 때, 나는 각 샘플 프로그램 (일부 기본 방언)을 웹 페이지에서 실행되는 Java 애플릿으로 변환했습니다. 애플릿은 여기에 있습니다. http://hewgill.com/chaos-and-fractals/

샘플 중 하나는 간단한 Mandelbrot 구현입니다.

배울 수있는 또 다른 우수한 프랙탈은 Sierpinski Triangle Fractal입니다.

기본적으로 삼각형의 3 개의 모서리를 그립니다 (평형이 선호되지만 삼각형이 작동합니다). 그런 다음 해당 모서리 중 하나에서 점 P를 시작하십시오. P를 무작위로 3 모서리 중 하나로 이동하고 그곳에 포인트를 그립니다. 다시 P를 임의의 코너쪽으로 반쯤 움직이고, 그리고 반복하십시오.

당신은 임의의 움직임이 무작위 결과를 일으킬 것이라고 생각할 것이지만 실제로는 그렇지 않습니다.

참조: http://en.wikipedia.org/wiki/sierpinski_triangle

Sierpinski Triangle과 Koch 곡선은 특수한 유형의 화염 프랙탈입니다. 불꽃 프랙탈은 비선형 함수를 사용하기 때문에 매우 일반화 된 반복 기능 시스템입니다.

IFS에 대한 알고리즘 : ES는 다음과 같습니다.

Start with a random point.

다음을 여러 번 반복하십시오 (최소한 최종 이미지 크기에 따라 백만 명) :

Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.

포인트가 화면 외부에 있으면 화면 내부의 새 제품을 무작위로 선택하십시오.

멋진 색상을 원한다면 색상이 마지막으로 사용 된 변환에 의존하게하십시오.

나는 a와 같은 단순한 것으로 시작할 것입니다 코흐 눈송이. 그것은 줄을 세우고 변형시키는 간단한 과정입니다. 그런 다음 프로세스가 깔끔하게 보일 때까지 재귀 적으로 반복합니다.

2 포인트 (라인)를 가져 와서 3 점 (코너 제작)을 추가 한 다음 생성 된 각 새 섹션에서 반복하는 것과 같은 단순한 것입니다.

fractal(p0, p1){
    Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1;
    fractal(p0,Pmid);
    fractal(Pmid, p1);
}

프랙탈을 알고리즘이나 프로그래밍 할 무언가로 보지 않을 수도 있다고 생각합니다. Fractals는 개념입니다! 그것은 상세한 패턴을 반복하는 수학적 개념입니다.

따라서 아래 이미지와 같이 다른 접근법을 사용하여 여러 가지 방법으로 프랙탈을 만들 수 있습니다.

enter image description here

접근 방식을 선택한 다음 구현 방법을 조사하십시오. 이 네 가지 예는 사용하여 구현되었습니다 마빈 프레임 워크. 소스 코드를 사용할 수 있습니다 여기

Mandelbrot 세트는 오버플로 될 때까지 (일부 정의 된 한계) 함수를 반복적으로 평가 한 다음 오버플로에 걸리는 시간을 확인하여 생성됩니다.

의사 코드 :

MAX_COUNT = 64 // if we haven't escaped to infinity after 64 iterations, 
               // then we're inside the mandelbrot set!!!

foreach (x-pixel)
  foreach (y-pixel)
    calculate x,y as mathematical coordinates from your pixel coordinates
    value = (x, y)
    count = 0
    while value.absolutevalue < 1 billion and count < MAX_COUNT
        value = value * value + (x, y)
        count = count + 1

    // the following should really be one statement, but I split it for clarity
    if count == MAX_COUNT 
        pixel_at (x-pixel, y-pixel) = BLACK
    else 
        pixel_at (x-pixel, y-pixel) = colors[count] // some color map. 

메모:

값은 복소수입니다. 복소수 (a+bi) 주어지기 위해 제곱된다 (aab*b+2*a나). 복잡한 유형을 사용하거나 해당 계산을 루프에 포함시켜야합니다.

Mandelbrot 및 기타 프랙탈 예제에 대한 Java의 간단하고 이해하기 쉬운 코드는 다음과 같습니다.

http://code.google.com/p/gaima/wiki/vlfimages

buildfractal.jar를 다운로드하여 Java로 테스트하고 명령으로 실행하십시오.

java -xmx1500m -jar buildfractal.jar 1000 1000 Default Mandelbrot

소스 코드는 또한 무료로 다운로드/탐색/편집/확장 할 수 있습니다.

글쎄, 단순하고 그래픽 적으로 매력적인 것은 실제로 함께 가지 않습니다. 프랙탈을 프로그래밍하는 것에 대해 진지하게 생각한다면 반복 된 기능 시스템과 렌더링 할 때의 발전을 읽는 것이 좋습니다.

http://flam3.com/flame_draves.pdf

위의 사람들은 Sierpinski와 Koch에 대한 중간 포인트를 사용하고 있으며, 모양을 복사하고 스케일링 한 다음 "Fractal"효과를 달성하도록 번역하는 것이 훨씬 더 좋습니다. Sierpinski를위한 Java의 의사 코드는 다음과 같습니다.

public ShapeObject transform(ShapeObject originalCurve)
    {
        Make a copy of the original curve
        Scale x and y to half of the original
        make a copy of the copied shape, and translate it to the right so it touches the first copied shape
        make a third shape that is a copy of the first copy, and translate it halfway between the first and second shape,and translate it up
        Group the 3 new shapes into one
        return the new shape
    }

때때로 나는 재미와 도전으로 프랙탈을 프로그래밍합니다. 당신은 그들을 찾을 수 있습니다 여기. 이 코드는 P5.JS 라이브러리를 사용하여 JavaScript로 작성되었으며 HTML 소스 코드에서 직접 읽을 수 있습니다.

알고리즘이 매우 간단한 것을 본 사람들의 경우 핵심 요소를 찾은 다음 반복해서 반복하십시오. 재귀 함수로 수행하지만 다르게 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top