生成带旋转和半长轴和半短轴的椭圆
Generating ellipse with rotation and semi-major and semi-minor axes
我有日食的参数:半长轴;半短轴;旋转角度;椭圆中心的 x 位置;椭圆中心的 y 位置。
我希望生成一个数组,其中椭圆内的所有点都设置为 1,而椭圆外的所有点都设置为零。
我找到了this answer,它给出了这个没有旋转和使用高度和宽度的解决方案,而不是半大调和半小调:
import numpy as np
from matplotlib import pyplot as plt
x0 = 4 # x center,
a = 5 # half width
y0 = 2 # y center,
b = 3 # half height
x = np.linspace(-10, 10, 100) # x values of interest
y = np.linspace(-5, 5, 100)[:,
None] # y values of interest, as a "column" array
ellipse = ((x - x0) / a)**2 + (
(y - y0) / b)**2 <= 1 # True for points inside the ellipse
plt.imshow(ellipse, origin="lower") # Plot
因此,我希望修改此代码以获取我需要的参数。我找到了 eclipse 的一般方程的定义 here
我试图通过以下修改重现此内容:
import numpy as np
from matplotlib import pyplot as plt
x0 = 4 # x center,
a = 5 # half width
y0 = 2 # y center,
b = 3 # half height
x = np.linspace(-10, 10, 100) # x values of interest
y = np.linspace(-5, 5, 100)[:,
None] # y values of interest, as a "column" array
def calc_ellipse(x, y, x_centre, y_centre, rotation, semi_major, semi_minor):
# https://www.maa.org/external_archive/joma/Volume8/Kalman/General.html
...
term1 = ((x - x_centre) * np.cos(rotation)) + (
(y - y0) * np.sin(rotation))**2
term2 = ((x - x_centre) * np.sin(rotation)) + (
(y - y0) * np.cos(rotation))**2
ellipse = ((term1 / semi_major**2) + (term2 / semi_minor**2)) <= 1
return ellipse
ellipse = calc_ellipse(x, y, x0, y0, 0, a, b)
plt.imshow(ellipse, origin="lower") # Plot
然而,正如您所见,我最终得到了一个奇怪的形状,即使我将旋转角度设置为 0。
展示了一种生成旋转椭圆的方法,但是参数是硬编码的,因此不可重用或不易解释。
如何使用定义日食一般方程的参数生成这样的数组?
在您的 calc_ellipse
函数中,您在 term1
和 term2
中缺少括号。为了匹配您发布的公式,它应该如下所示:
term1 = (((x - x_centre) * np.cos(rotation)) + (
(y - y0) * np.sin(rotation)))**2
term2 = (((x - x_centre) * np.sin(rotation)) + (
(y - y0) * np.cos(rotation)))**2
或者像这样:
term1 = ((x - x_centre) * np.cos(rotation) +
(y - y0) * np.sin(rotation))**2
term2 = ((x - x_centre) * np.sin(rotation) +
(y - y0) * np.cos(rotation))**2
尝试这些更改,看看是否有效。
我有日食的参数:半长轴;半短轴;旋转角度;椭圆中心的 x 位置;椭圆中心的 y 位置。
我希望生成一个数组,其中椭圆内的所有点都设置为 1,而椭圆外的所有点都设置为零。
我找到了this answer,它给出了这个没有旋转和使用高度和宽度的解决方案,而不是半大调和半小调:
import numpy as np
from matplotlib import pyplot as plt
x0 = 4 # x center,
a = 5 # half width
y0 = 2 # y center,
b = 3 # half height
x = np.linspace(-10, 10, 100) # x values of interest
y = np.linspace(-5, 5, 100)[:,
None] # y values of interest, as a "column" array
ellipse = ((x - x0) / a)**2 + (
(y - y0) / b)**2 <= 1 # True for points inside the ellipse
plt.imshow(ellipse, origin="lower") # Plot
因此,我希望修改此代码以获取我需要的参数。我找到了 eclipse 的一般方程的定义 here
我试图通过以下修改重现此内容:
import numpy as np
from matplotlib import pyplot as plt
x0 = 4 # x center,
a = 5 # half width
y0 = 2 # y center,
b = 3 # half height
x = np.linspace(-10, 10, 100) # x values of interest
y = np.linspace(-5, 5, 100)[:,
None] # y values of interest, as a "column" array
def calc_ellipse(x, y, x_centre, y_centre, rotation, semi_major, semi_minor):
# https://www.maa.org/external_archive/joma/Volume8/Kalman/General.html
...
term1 = ((x - x_centre) * np.cos(rotation)) + (
(y - y0) * np.sin(rotation))**2
term2 = ((x - x_centre) * np.sin(rotation)) + (
(y - y0) * np.cos(rotation))**2
ellipse = ((term1 / semi_major**2) + (term2 / semi_minor**2)) <= 1
return ellipse
ellipse = calc_ellipse(x, y, x0, y0, 0, a, b)
plt.imshow(ellipse, origin="lower") # Plot
然而,正如您所见,我最终得到了一个奇怪的形状,即使我将旋转角度设置为 0。
如何使用定义日食一般方程的参数生成这样的数组?
在您的 calc_ellipse
函数中,您在 term1
和 term2
中缺少括号。为了匹配您发布的公式,它应该如下所示:
term1 = (((x - x_centre) * np.cos(rotation)) + (
(y - y0) * np.sin(rotation)))**2
term2 = (((x - x_centre) * np.sin(rotation)) + (
(y - y0) * np.cos(rotation)))**2
或者像这样:
term1 = ((x - x_centre) * np.cos(rotation) +
(y - y0) * np.sin(rotation))**2
term2 = ((x - x_centre) * np.sin(rotation) +
(y - y0) * np.cos(rotation))**2
尝试这些更改,看看是否有效。