2011-12-30 8 views
0

Pythonで単純なマンデルブロ可視化ツールをpygameスクリーンに書いています。 600 x 600スクリーン上の各ピクセルについて、このピクセル(x、y)が複素数としてマンデルブロ集合に入っているかどうかをプロットしています。キャンバス上の点を実平面上の点に写像する関数を書く方法

私は(0、0)から始まり、(600,600)まで繰り返されますが、そのほとんどはセットの外側にあります。だから私はズームインする倍率でチャックしますが、私はまだ右上の四分円をプロットしています。私のプロットはいつも0 + 0iを中心にしていたので、それを作るための何らかの方法が欲しいです。

私がしたいのは、600px^2キャンバスをx軸の[-2、2]からy軸の[-2、-2]までの実数平面にマップする方法を見つけることです。軸。これは、例えば、複素数0 + 0iが(300,300)にマップされることを意味する。この方法では、私のプロットは常に中央に配置されます。

答えて

1

データのウィンドウが必要です。あなたはそれが幅600ピクセル、高さ600ピクセルだと分かっています。ピクセル座標は(0、0) - (600,600)です。あなたはこれを行うことができます。

Point coordFromPixelLocation (pixelX, pixelY, pixelWidth, pixelHeight, minCoordX, maxCoordX, minCoordY, maxCoordY) 
{ 
    xPercent = pixelX/pixelWidth; 
    yPercent = pixelY/pixelHeight; 

    newX = minCoordX + (maxCoordX - minCoordX) * xPercent; 
    newY = minCoordY + (maxCoordY - minCoordY) * yPercent; 

    return Point (newX, newY); 
} 

pixelXとpixelY

は、ピクセルは、あなたがより小さな範囲に変換すること座標です。 pixelWidthとheightはウィンドウの幅と高さです。 min/maxCoordX/Yは(-2、-2)〜(2,2)の値です。真実で

+0

しかし、pythonには注意してください!人々が整数で送信する可能性が非常に高いですし、あなたの部門は残忍に切り捨てられます。これを試したい場合は、分子を浮動小数点数に明示的に変換する必要があります。 (xFractionとも呼ばれ、実際はパーセンテージです)。また、これは実際に-2. + 1.993333の範囲を生成しますが、これはおそらく十分に近いでしょう。 –

+0

'from __future__ import division'? – jrennie

1

私はより柔軟なアプローチを取り、あなたのコードを書く、かなり任意のマッピングを可能にする、しかし、あなたが求めるものを文字通りやってしまう、あなたが試すことができます:

x = (float(pix_x) + 0.5 - 300.0)/150.0 

yの同じ。これは、各ピクセルを画面対の中心の点として扱いますが、の角のの角を(+ -2、+ -2)にマッピングします。これは、ビューポート全体を複雑な平面上の四角形全体にマップする最も正しい方法ですが、これの1つの欠点は、0、実線、または線などの重要な数値をプロットしないことです。想像線。

1
class Mapper: 
    def __init__(self, old_ul, old_lr, new_ul, new_lr): 
     self.old_ul = old_ul 
     self.old_lr = old_lr 
     self.new_ul = new_ul 
     self.new_lr = new_lr 
     self.old_diff = Point(old_lr.x - old_ul.x, 
           old_ul.y - old_lr.y) 
     self.new_diff = Point(new_lr.x - new_ul.x, 
           new_ul.y - new_lr.y) 

    def map(self, pt): 
     nx = (self.old_lr.x+pt.x) * (self.new_diff.x/self.old_diff.x) + self.new_ul.x 
     ny = (self.old_ul.y+pt.y) * (self.new_diff.y/self.old_diff.y) + self.new_lr.y 
     return Point(nx, ny) 
def main(args): 
    pixelToReal = Mapper(Point(0, 0), Point(600, 600), Point(-2, 2), Point(2, -2)) 
    realToPixel = Mapper(Point(-2, 2), Point(2, -2), Point(0, 0), Point(600, 600)) 
    print(pixelToReal.map(Point(300,300))) # prints 0.0,0.0 
    print(realToPixel.map(pixelToReal.map(Point(300,300)))) # prints 300,300 
    for x in range(0,630, 30): 
     for y in range(0,630, 30): 
      print(pixelToReal.map(Point(x,y))) 

Mapperのコンストラクタは、元の左上と右下隅、および新しい左上と右下隅を取ります。 Mapper.map()はポイントを元のスペースから新しいスペースに変換します。

関連する問題