生成带旋转和半长轴和半短轴的椭圆

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 函数中,您在 term1term2 中缺少括号。为了匹配您发布的公式,它应该如下所示:

    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

尝试这些更改,看看是否有效。