以前、turtle を使用して Python でマンデルブロー生成器を作成しました。現在、速度を上げて画像サイズの制限を減らすために、Python Imaging Library を使用するようにプログラムを書き直しています。
ただし、以下のプログラムはRGBナンセンスのみを出力し、ほとんどノイズです。NumPy と PIL が配列を処理する方法の違いと関係があると思います。なぜなら、とが実行されたときにl[x,y] = [1,1,1]whereが1 ピクセルを白くするだけでl = np.zeros((height,width,3)) はないからです。img = Image.fromarray(l)img.show()
def imagebrot(mina=-1.25, maxa=1.25, minb=-1.25, maxb=1.25, width=100, height=100, maxit=300, inf=2):
l,b = np.zeros((height,width,3), dtype=np.float64), minb
for y in range(0, height):
a = mina
for x in range(0, width):
ab = mandel(a, b, maxit, inf)
if ab[0] == maxit:
l[x,y:] = [1,1,1]
#if ab[0] < maxit:
#smoothit = mandelc(ab[0], ab[1], ab[2])
#l[x, y] = colorsys.hsv_to_rgb(smoothit, 1, 1)
a += abs(mina-maxa)/width
b += abs(minb-maxb)/height
img = Image.fromarray(l, "RGB")
img.show()
def mandel(re, im, maxit, inf):
z = complex(re, im)
c,it = z,0
for i in range(0, maxit):
if abs(z) > inf:
break
z,it = z*z+c,it+1
return it,z,inf
def mandelc(it,z,inf):
return (it+1-log(log(abs(z)))/log(2))
更新 1:
このプログラムの主なエラーの 1 つ (間違いなくたくさんあると思います) は、複素係数として x,y 座標を使用していたことに気付きました! つまり、-1.25 から 1.25 ではなく、0 から 100 です! これを変更して、コードが変数 a,b を使用してそれらを記述し、タートル バージョンのコードの一部から盗んだ方法でインクリメントします。上記のコードはそれに応じて更新されています。Smooth Coloring Algorithm コードは現在、デバッグ用にコメントアウトされているため、inf変数2のサイズが縮小されています。
更新 2:
優れたユーザーの助けを借りて、numpy インデックスを編集しました。200 x 200 に設定すると、プログラムはこれを出力します。
ご覧のとおり、間違いなく数学的な形状を示していますが、これらすべての奇妙な赤、緑、青のピクセルで満たされています! なぜこれらがここにあるのでしょうか?[1,1,1]私のプログラムでは、RGB 値をdefault に設定するか、そのままにしておくことしかできません[0,0,0]。そんなはずない[1,0,0]- これは重大な欠陥に違いない.
更新 3:
NumPy と PIL の統合にエラーがあると思います。makel = np.zeros((100, 100, 3))を記述l[0,0,:] = 1して最後にimg = Image.fromarray(l)&を指定すると、次のimg.show()ようになります。
ここでは、一連の色付きのピクセルを取得します。これには別の質問が必要です。
更新 4:
以前に何が起こっていたのかわかりませんが、np.uint8配列のようで、0 ~ Image.fromarray()255 の色の値を使用しています。この知恵のおかげで、私はこのマンデルバグの理解に一歩近づきました!
今、私は漠然と数学的なものを手に入れましたが、それでも奇妙なものを出力します。
このドットだけがすべてです... に変更するとnp.uint16、さらに奇妙なことがわかります。これは、バイト形状とエンコード方式が異なるためだと思います。


