5

マンデルブロ集合の画像を生成するための 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]

セットの特定のセクションをレンダリングするには、何を変更する必要がありますか?

4

2 に答える 2

15

この線:

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

は、レンダリングされる座標空間の領域を定義するビットであるため、この行を変更するだけで済みます。最初の座標ペアは領域の左上、2 番目は右下です。

画像から新しい座標を取得するのは非常に簡単です。2 つの座標系があります。「画像」システムのサイズは 100x100 ピクセルで、原点は (0,0) です。そして、「ボックス」で定義された「複雑な」平面座標系。X の場合:

X_complex=X_complex_origin+(X_image/X_image_width)*X_complex_width
于 2009-02-07T18:31:16.433 に答える
4

これを行う方法を理解するための鍵は、coords =行が何をしているのかを理解することです:

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

事実上、画面上のピクセルの座標に対応するループしている値xと値は、見ている複素平面上の対応する点に変換されています。yこれは、(0,0)画面座標が、見ている左上の領域に変換され(-2,1.25)、同じになることを意味しますが、とx 座標(1,0)の間の距離 (500 ピクセル幅のウィンドウを想定) の 1/500 だけ移動します。-20.5

それがまさにその行が行っていることです。これを示すために、より具体的な変数名で X 座標ビットだけを展開します。

mandel_x = mandel_start_x + (screen_x / screen_width) * mandel_width

(mandel_変数は複素平面上の座標をscreen_参照し、変数はプロットされるピクセルの画面上の座標を参照します。)

画面の領域をズームインする場合は、まったく同じことを行います。左上と右下の領域の画面座標を取得し、それらを複素平面座標に変換して、それらを作成します新しい uleft および lright 変数。つまり、画面上の座標 (x1,y1)..(x2,y2) で区切られたボックスを拡大するには、次を使用します。

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、およびその他の従属変数を再計算する必要があります)

興味がある方のために説明すると、マンデルブロ集合の背後にある数学はそれほど複雑ではありません (複雑なだけです)。それがしているのは、特定の座標を取り、それを複素数として扱い、それを繰り返し二乗して元の数を足すことだけです。

数によっては、これを行うと結果が発散し、プロセスを繰り返すにつれて無限に向かって絶えず成長します。他の人にとっては、それは常に特定のレベル以下にとどまります (例えば、明らかに (0.0, 0.0) はこのプロセスの下では決して大きくなりません. マンデルブロ集合 (黒い領域) は発散しない座標です.任意の数値が 5 の平方根を超えると発散します。コードは(~ ) の2.0近似値として使用しているだけですが、これは大きな違いにはなりません。 sqrt(5)2.236

trials通常、発散する領域は、色付きの領域を生成するこの値 (コード内の変数) を超えるまでにかかるプロセスの反復回数でプロットされます。

于 2009-02-07T20:19:36.137 に答える