【发布时间】:2014-09-22 22:13:13
【问题描述】:
我有一个方程,它以一般形式 x^2/a^2 + y^2/b^2 = 1 创建一个椭圆。我希望生成一个数组,其中椭圆内的所有点都设置为 1,并且外面的所有点都是零。然后将这个数组与另一个数组进行卷积。
到目前为止,我已经尝试创建一个空数组,其大小我希望遍历所有 x,y 位置,计算 x^2/a^2 + y^2/b^2 = 1。如果一般形式是小于 1 将 1 输入数组,否则继续下一个 x,y 位置。
这是我的代码:
arr = numpy.array(im)
sh = numpy.shape(arr)
ar = numpy.empty(sh)
for x in range (sh[0]):
xx = x*x
for y in range (sh[1]):
yy = y*y
ellips = xx/(a*a)+yy/(b*b)
if ellips < 1:
ar[xx,yy] = '1'
else:
break
但是,这并没有产生我所期望的结果,因为我的椭圆总是以 (0,0) 为中心,因此我希望它们位于数组的中心,但它们出现在左上角。
有没有人知道我哪里出错了?或者也许是生产我的阵列的更好方法?
---编辑---
尝试过 EOL 的回答后,我收到了一个椭圆数组,但它与它应该建模的椭圆不匹配。这是一张图片来说明我的意思:http://i.imgur.com/M4vh4il.jpg?1 椭圆数组没有椭圆的旋转。 生成椭圆和椭圆数组的代码如下:
def Ellipssee(z,stigx,stigy):
points=100 #Number of points to construct the ellipse
x0,y0 = 0,0 #Beam is always centred
z0 = 4 # z0 a constant of the device
al = 2 # alpha a constant of the device
de = sqrt((stigx**2 + stigy**2))
ang = arctan2(stigy, stigx) # result in radians
a = (z+de-z0)*al
b = (z-de-z0)*al
cos_a,sin_a=cos(ang),sin(ang)
the=linspace(0,2*pi,points)
X=a*cos(the)*cos_a-sin_a*b*sin(the)+x0
Y=a*cos(the)*sin_a+cos_a*b*sin(the)+y0
img = Image.open("bug.png").convert("L") # load image for array size
arr = np.array(img)
sh = np.shape(arr)
nx = sh[0] # number of pixels in x-dir
ny = sh[1] # number of pixels in y-dir
x0 = 0; # x center, half width
y0 = 0; # y center, half height
x = np.linspace(-60, 60, nx) # x values of interest
y = np.linspace(-30, 30, ny) # y values of interest
ellipseArr = ((x-x0)/a)**2 + ((y[:,None]-y0)/b)**2 <= 1
我一直在使用值 Ellipse(1,6,8) 调用该方法。
为什么在创建数组时会丢失旋转?
【问题讨论】:
-
如果您希望椭圆位于 (0, 0) 以外的其他位置(即“左上角”),例如 (x0, y0),那么您应该使用
ellips = ((x-x0)/a)**2 + ((y-y0)/b)**2。 -
@EOL 感谢您的评论。我不希望我的椭圆在中心 (0,0) 以外的任何地方,因此不需要在一般方程中包含 x0,y0 项。编辑* 阅读了 Gabriel 的回答后,我明白你现在的意思了。感谢您指出这一点:)
-
EOL 是对的 Nate。您必须调整方程,或使用以 (0,0) 为中心的坐标系。详情见我的回答
-
另外,正如您的原始代码一样,您不想使用
break,而是要设置ar[xx,yy] = '0' wherebreak`。np.empty创建一个数组而不初始化任何值,因此如果它们不满足不等式,则需要将它们设置为 '0'。 -
@Nate:坐标的问题是数组“开始”在 (0, 0) - 这是它们的角之一。这就是为什么如果您将椭圆居中在 (0, 0) 中,那么您就是将其居中在一个角上——因此需要将椭圆居中于其他位置。
标签: python arrays python-2.7 numpy ellipse