Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写函数将画布上的点映射到真实平面上的点_Python_Pygame_Fractals_Complex Numbers - Fatal编程技术网

Python 如何编写函数将画布上的点映射到真实平面上的点

Python 如何编写函数将画布上的点映射到真实平面上的点,python,pygame,fractals,complex-numbers,Python,Pygame,Fractals,Complex Numbers,我正在用Python在pygame屏幕上编写一个简单的Mandelbrot可视化程序。对于600 x 600屏幕上的每个像素,我正在绘制这个像素(x,y)是否在Mandelbrot集合中,作为复数 问题是我从(0,0)开始,迭代到(600600),其中大部分都在集合之外。所以我加入了一个比例因子来放大,但我仍然只绘制右上象限。我想用某种方法来制作它,使我的绘图始终以0+0i为中心 我想做的是找到某种方法,将600px^2画布映射到真实平面,从x轴上的[-2,2]到y轴上的[2,-2]。例如,这意

我正在用Python在pygame屏幕上编写一个简单的Mandelbrot可视化程序。对于600 x 600屏幕上的每个像素,我正在绘制这个像素(x,y)是否在Mandelbrot集合中,作为复数

问题是我从(0,0)开始,迭代到(600600),其中大部分都在集合之外。所以我加入了一个比例因子来放大,但我仍然只绘制右上象限。我想用某种方法来制作它,使我的绘图始终以0+0i为中心


我想做的是找到某种方法,将600px^2画布映射到真实平面,从x轴上的[-2,2]到y轴上的[2,-2]。例如,这意味着复数0+0i将映射到屏幕上的(300300)。这样,我的绘图将始终居中。

您需要一个数据窗口。你知道它有600像素宽,600像素高。像素坐标为(0,0)-(600600)。您可以这样做:

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);
}

像素X和像素Y是要转换为较小范围的像素坐标。像素宽度和高度是窗口的宽度和高度。min/maxCoordX/Y是(-2,-2)到(2,2)的值。

您需要一个数据窗口。你知道它有600像素宽,600像素高。像素坐标为(0,0)-(600600)。您可以这样做:

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);
}

像素X和像素Y是要转换为较小范围的像素坐标。像素宽度和高度是窗口的宽度和高度。min/maxCoordX/Y是(-2,-2)到(2,2)的值。

事实上,我会采取更灵活的方法,编写代码以允许相当任意的映射,但要按要求执行,您可以尝试:

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

然后是相同的
y
。这会将每个像素视为屏幕对中心的一个点,但会将像素的角点映射到(+-2,+-2)。这是将整个视口映射到复杂平面中的整个正方形的最“正确”的方法,但它的一个缺点是,您永远不会绘制一些重要的数字,例如0、实线或虚线。

事实上,我会采取更灵活的方法,并编写代码以允许相当任意的映射,但要真正做到你所要求的,你可以尝试:

x = (float(pix_x) + 0.5 - 300.0) / 150.0
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)))
然后是相同的
y
。这会将每个像素视为屏幕对中心的一个点,但会将像素的角点映射到(+-2,+-2)。这是将整个视口映射到复杂平面中的整个正方形的最“正确”的方法,但它的一个缺点是永远不会绘制一些重要的数字,例如0、实线或虚线

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的构造函数获取原始的左上角和右下角,以及新的左上角和右下角。map()将点从原始空间转换为新空间


Mapper的构造函数获取原始的左上角和右下角,以及新的左上角和右下角。Mapper.map()将点从原始空间转换为新空间。

但在python中一定要小心!很可能人们会输入整数,而你的除法会被残酷地四舍五入。如果要尝试此操作,应显式地将分子转换为浮点数。(也称为xFraction,它实际上是一个百分比)。此外,这将实际产生范围-2+1.993333,可能已经足够接近了。
来自未来导入部门
?但是在python中一定要小心!很可能人们会输入整数,而你的除法会被残酷地四舍五入。如果要尝试此操作,应显式地将分子转换为浮点数。(也称为xFraction,它实际上是一个百分比)。此外,这将实际产生范围-2+1.993333,可能已经足够接近了。
来自未来进口部门