1

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) にマップされることを意味します。このようにして、私のプロットは常に中央に配置されます。

4

3 に答える 3

2

データ用のウィンドウが必要です。幅 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) の値です。

于 2011-12-30T19:52:22.977 に答える
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() は、ポイントを元の空間から新しい空間に変換します。

于 2011-12-30T21:16:09.207 に答える
1

実際には、私はより柔軟なアプローチを取り、かなり任意のマッピングを許可するようにコードを記述しますが、文字通りあなたが求めることを行うには、次のことを試すことができます:

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

の同じy。これは、各ピクセルを画面上のペアの中心にある点として扱いますが、ピクセルのを (+-2, +-2) にマップします。これは、ビューポート全体を複素平面の正方形全体にマッピングする最も「正しい」方法ですが、この方法の 1 つの欠点は、0、実線、またはイマジナリーライン。

于 2011-12-30T19:58:47.640 に答える