椭圆区域的网格/格/矩阵

时间:2018-11-18 10:15:28

标签: python geometry ellipse

我可能使用了错误的术语,但寻求一些帮助。

我想为位于椭圆形周长内的网格生成x,y值的数组。

这里有代码:http://people.sc.fsu.edu/~jburkardt/c_src/ellipse_grid/ellipse_grid.html用Python完成。

但是,出于我的目的,椭圆已旋转到一定程度。当前的方程式不能解决这个问题,需要一些帮助来解决此转换问题,不确定如何更改代码以实现此目的吗?

我也一直在研究np.meshrid函数,因此,如果有更好的方法,请说。

非常感谢。

2 个答案:

答案 0 :(得分:1)

要在椭圆内部生成晶格点,我们必须知道水平线与该椭圆相交的位置。

以角度Theta旋转的零中心椭圆方程:

 x = a * Cos(t) * Cos(theta) - b * Sin(t) * Sin(theta)   
 y = a * Cos(t) * Sin(theta) + b * Sin(t) * Cos(theta)

为简化计算,我们可以引入伪角Fi和大小M(给定椭圆的常数)

 Fi = atan2(a * Sin(theta), b * Cos(theta))
 M = Sqrt((a * Sin(theta))^2 + (b * Cos(theta))^2)

如此

 y = M * Sin(Fi) * Cos(t) + M * Cos(Fi) * Sin(t)
 y/M = Sin(Fi) * Cos(t) +  Cos(Fi) * Sin(t)
 y/M = Sin(Fi + t) 

和给定水平线y的解为

 Fi + t = ArcSin( y / M)
 Fi + t = Pi - ArcSin( y / M)
 t1 = ArcSin( y / M) - Fi        //note two values
 t2 = Pi - ArcSin( y / M) - Fi

将第一个方程中的t值都替换为给定Y的X值,并生成一个晶格点序列

要获取顶部和底部坐标,请区分y

y' = M * Cos(Fi + t) = 0
th = Pi/2 - Fi
tl = -Pi/2 - Fi

找到相应的y,并将其用作线条的起始和结束Y坐标。

import math

def ellipselattice(cx, cy, a, b, theta):
    res = []
    at = a * math.sin(theta)
    bt = b * math.cos(theta)
    Fi = math.atan2(at, bt)
    M = math.hypot(at, bt)
    ta = math.pi/2 - Fi
    tb = -math.pi/2 - Fi
    y0 = at * math.cos(ta) + bt *math.sin(ta)
    y1 = at * math.cos(tb) + bt *math.sin(tb)
    y0, y1 = math.ceil(cy + min(y0, y1)), math.floor(cy + max(y0, y1))
    for y  in range(y0, y1+1):
        t1 = math.asin(y / M) - Fi
        t2 = math.pi - math.asin(y / M) - Fi
        x1 = a * math.cos(t1) * math.cos(theta) - b* math.sin(t1) * math.sin(theta)
        x2 = a * math.cos(t2) * math.cos(theta) - b* math.sin(t2) * math.sin(theta)
        x1, x2 = math.ceil(cx + min(x1, x2)), math.floor(cx + max(x1, x2))
        line = [(x, y) for x in range(x1, x2 + 1)]
        res.append(line)
    return res

print(ellipselattice(0, 0, 4, 3, math.pi / 4))

答案 1 :(得分:1)

以最普遍的形式给出欧氏平面中的椭圆,形式为二次曲线

f(x,y) = a x^2 + 2b x y + c y^2 + 2d x + 2f y + g,

一个人可以通过

计算中心(x0,y0)
((cd-bf)/(b^2-ac), (af-bd)/(b^2-ac)) 

(请参见Ellipse on MathWorld上的方程式19和20)。主轴a_m的长度可以由同一页面上的公式21计算。

现在就可以找到

以中心(x,y)和半径(x0,y0)的圆内的所有网格点a_m
sign(f(x,y)) = sign(f(x0,y0)).