2009-02-07 4 views
5

필자는 Mandelbrot 세트 이미지를 생성하기 위해 Python 파일을 만들었습니다. 원래의 수학 코드는 광산이 아니므로 이해할 수 없습니다. 단지 250 배 정도 더 빨리 수정했습니다 (스레드 규칙!).만델 브로 세트의 섹션을 '확대'하는 방법은 무엇입니까?

어쨌든, 나는 하나의 특정 비트를 렌더링하도록 코드의 수학 부분을 어떻게 수정할 수 있는지 궁금합니다.

for y in xrange(size[1]): 
     coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) 
     z = complex(coords[0],coords[1]) 
     o = complex(0,0) 
     dotcolor = 0 # default, convergent 
     for trials in xrange(n): 
      if abs(o) <= 2.0: 
       o = o**2 + z 
      else: 
       dotcolor = trials 
       break # diverged 
     im.putpixel((x,y),dotcolor) 

그리고 크기 정의 : 다음은 수학 부분입니다

size1 = 500 
size2 = 500 
n=64 
box=((-2,1.25),(0.5,-1.25)) 
plus = size[1]+size[0] 
uleft = box[0] 
lright = box[1] 
xwidth = lright[0] - uleft[0] 
ywidth = uleft[1] - lright[1] 

내가 그것을 세트의 특정 부분을 렌더링하기 위해 수정해야합니까?

+0

코드를 더 빠르게 만들기 위해 스레드를 사용한 방법을 놓쳤습니다. 파이썬 바이트 코드 쓰레드상의 e는 GIL 때문에 동시에 실행되지 않을 것이다. – nosklo

답변

14

라인 :

box=((-2,1.25),(0.5,-1.25)) 

가 렌더링되는 좌표 공간의 영역을 정의 비트, 그래서 그냥이 줄을 변경해야합니다. 첫 번째 좌표 쌍은 영역의 왼쪽 상단이고 두 번째 좌표는 오른쪽 하단입니다.

이미지에서 새로운 좌표를 얻으려면 매우 간단해야합니다. 두 개의 좌표계가 있습니다. "image"시스템은 크기가 100x100 픽셀이고 원점은 (0,0)입니다. 그리고 "상자"로 정의 된 "복잡한"평면 좌표계. X의 경우 :

X_complex=X_complex_origin+(X_image/X_image_width)*X_complex_width 
+0

고마워요! X 및 Y 값으로 변환하려면 어떻게해야합니까? 가능한가? – Lobe

+0

상자에 두 개의 x, y 쌍이 포함되어 있습니다. 상자 = ((x, y), (x, y)) 질문에 대한 답변이 있습니까? –

+0

아, 죄송합니다. 막대기의 끝이 잘못되었습니다. 100x100 이미지의 치수가 있다면 100x100 이미지 섹션의 x 및 y 값을 x 및 y 값으로 변환하여 어떻게 확대 할 수 있습니까? 그게 가능한지 의심 스럽네요. – Lobe

4
이 작업을 수행하는 방법을 이해하는 열쇠가 coords = 라인이 무엇을하고 있는지 이해하는 것입니다

:

coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) 

효과적으로, 당신이 반복하고있는 xy 값은이를 통해 해당 온 - 스크린 픽셀의 좌표들은보고있는 복소 평면상의 대응하는 포인트로 변환된다. 즉, (0,0) 화면 좌표는 왼쪽 상단 영역이 (-2,1.25)이며, (1,0)은 동일하지만, -20.5 x 좌표 사이에서 거리의 1/500 (500 픽셀 너비 가정)으로 이동 함을 의미합니다.

정확히 선이 무엇을하고 있는지의 그 - 난 그냥 더 설명 변수 이름으로 X 좌표 비트이 표시하기 위해 확장됩니다 :

mandel_x = mandel_start_x + (screen_x/screen_width) * mandel_width 

합니다 (mandel_ 변수는 복소 평면에 좌표를 참조를 , screen_ 변수는 그림으로 그려지는 픽셀의 화면상의 좌표를 나타냅니다.)

화면의 영역을 확대하려면 다음과 똑같이하고 싶습니다. 왼쪽 위와 오른쪽 아래 영역을 복잡한 평면 좌표로 변환합니다. 그것들을 새로운 uleft와 lright 변수로 만든다.

new_uleft = (uleft[0] + (x1/size[0]) * (xwidth), uleft[1] - (y1/size[1]) * (ywidth)) 
new_lright = (uleft[0] + (x2/size[0]) * (xwidth), uleft[1] - (y2/size[1]) * (ywidth)) 
당신은 크기, xwidth, ywidth를 다시 계산해야합니다 분명히

(과 : 즉 화면 좌표 (X1, Y1) .. (X2, Y2)를 사용하여 구분 상자 확대하기

궁금한 점이 있다면, 만델 브로트 세트 뒤의 수학은 복잡하지 않습니다 (단지 복잡한 것). 모든 작업은 특정 좌표를 취하여 복소수로 취급 한 다음 반복적으로 제곱하고 원래 수를 추가하는 것입니다.

일부 숫자의 경우 결과가 분기되어 반복적으로 무한대로 증가합니다. 다른 것들은 항상 일정 수준 이하로 유지 될 것입니다 (예 : 분명히 (0.0, 0.0)이 과정에서 결코 커지지 않음) 만델 브로트 세트 (검정 영역)는 발산하지 않는 좌표입니다. 코드가 단지 sqrt(5) (~ 2.236)에 자사의 근사치로 2.0을 사용하지만,이 훨씬 눈에 띄는 차이를 만들 수 없습니다

을 GET을 분기 보통 지역 - 숫자 5의 제곱근 위에 도착, 그것은 분기됩니다. 이 값 (코드의 변수 trials)을 초과하는 프로세스의 반복 횟수로 플롯됩니다.

관련 문제