我正在尝试对下面的第一张图片进行极坐标变换,最后是第二张图片。但是我的结果是第三张图片。我觉得这与我选择的“起源”位置有关,但我不确定。
radius = sqrt(width**2 + height**2)
nheight = int(ceil(radius)/2)
nwidth = int(ceil(radius/2))
for y in range(0, height):
for x in range(0, width):
t = int(atan(y/x))
r = int(sqrt(x**2+y**2)/2)
color = getColor(getPixel(pic, x, y))
setColor( getPixel(radial,r,t), color)
答案 0 :(得分:4)
存在一些差异/错误:
这是结合我建议的改进的代码。这不是很有效率,但它应该有效:)
maxradius = sqrt(width**2 + height**2)/2
rscale = width / maxradius
tscale = height / (2*math.pi)
for y in range(0, height):
dy = y - height/2
for x in range(0, width):
dx = x - width/2
t = atan2(dy,dx)%(2*math.pi)
r = sqrt(dx**2+dy**2)
color = getColor(getPixel(pic, x, y))
setColor( getPixel(radial,int(r*rscale),int(t*tscale)), color)
特别是,它通过以下方式解决了上述问题:
dx = x - width / 2
作为距中心距离的度量,与dy
类似。然后,我们在整个计算过程中使用这些代替x
,y
。r
满足0 <= r <= sqrt( (width/2)^2 +(height/2)^2 )
,我们t
最终会满足0 < t <= 2 pi
因此,我会创建适当的比例因子来放置r
和{ {1}}分别沿着t
和x
轴。y
只能基于渐变进行区分,并且在垂直线附近计算不稳定......相反,atan
(请参阅http://en.wikipedia.org/wiki/Atan2)解决了这两个问题,并接受{{1成对给出一个角度。 atan2
会返回一个角度(y,x)
,因此我们可以找到以atan2
为模的余数,使其在-pi < t <= pi
范围内准备好进行缩放。有任何问题,请问!