Python 如何编写函数将画布上的点映射到真实平面上的点
我正在用Python在pygame屏幕上编写一个简单的Mandelbrot可视化程序。对于600 x 600屏幕上的每个像素,我正在绘制这个像素(x,y)是否在Mandelbrot集合中,作为复数 问题是我从(0,0)开始,迭代到(600600),其中大部分都在集合之外。所以我加入了一个比例因子来放大,但我仍然只绘制右上象限。我想用某种方法来制作它,使我的绘图始终以0+0i为中心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]。例如,这意
我想做的是找到某种方法,将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,可能已经足够接近了。来自未来进口部门
?