Python 计算椭圆内的点

Python 计算椭圆内的点,python,matplotlib,ellipse,Python,Matplotlib,Ellipse,我试图计算椭圆环内的给定数据点: 问题是我有一个函数来检查: 因此,为了确定每个椭圆中是否有一个点,必须计算三个输入: def get_focal_point(r1,r2,center_x): # f = square root of r1-squared - r2-squared focal_dist = sqrt((r1**2) - (r2**2)) f1_x = center_x - focal_dist f2_x = center_x + focal_d

我试图计算椭圆环内的给定数据点:

问题是我有一个函数来检查: 因此,为了确定每个椭圆中是否有一个点,必须计算三个输入:

def get_focal_point(r1,r2,center_x):
    # f = square root of r1-squared - r2-squared
    focal_dist = sqrt((r1**2) - (r2**2))
    f1_x = center_x - focal_dist
    f2_x = center_x + focal_dist
    return f1_x, f2_x

def get_distance(f1,f2,center_y,t_x,t_y):
    d1 = sqrt(((f1-t_x)**2) + ((center_y - t_y)**2)) 
    d2 = sqrt(((f2-t_x)**2) + ((center_y - t_y)**2))
    return d1,d2

def in_ellipse(major_ax,d1,d2):
    if (d1+d2) <= 2*major_ax:
        return True
    else:
        return False
但我必须计算外环的每一对焦点。。
有没有更有效或更聪明的方法可以做到这一点?

以下是一些想法:

  • 您的想法是正确的,将用于计算焦点的代码移到循环之外
  • 通过删除平方根,可以加快距离计算。换句话说,我们知道
    a
    意味着
    sqrt(a)
    ,因此不需要计算平方根
  • 如果椭圆同心且长轴平行于x轴,则可以通过重新缩放x值将椭圆问题简化为圆问题
还有,这里有一个小的编码错误。if语句不需要返回True或False。相反,您可以返回条件表达式本身:

def in_ellipse(major_ax,d1,d2):
    return (d1+d2) <= 2*major_ax:
def在椭圆中(大轴,d1,d2):

return(d1+d2)这可能与您正在做的事情类似。我只是想看看 f(x,y)=x^2/r1^2+y^2/r2^2=1

当f(x,y)大于1时,点x,y在椭圆外。当它较小时,则它位于椭圆内。当f(x,y)小于1时,我循环通过每个椭圆来找到一个

代码也不考虑以原点为中心的椭圆。包含此功能只是一个小小的改变

import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

def inWhichEllipse(x,y,rads):
    '''
    With a list of (r1,r2) pairs, rads, return the index of the pair in which
    the point x,y resides. Return None as the index if it is outside all 
    Ellipses.
    '''
    xx = x*x
    yy = y*y

    count = 0
    ithEllipse =0
    while True:
        rx,ry = rads[count]
        ellips = xx/(rx*rx)+yy/(ry*ry)
        if ellips < 1:
            ithEllipse = count
            break
        count+=1
        if count >= len(rads):
            ithEllipse = None
            break

    return ithEllipse

rads = zip(np.arange(.5,10,.5),np.arange(.125,2.5,.25))

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-15,15)
ax.set_ylim(-15,15)

# plot Ellipses
for rx,ry in rads:
    ellipse = patches.Ellipse((0,0),rx*2,ry*2,fc='none',ec='red')    
    ax.add_patch(ellipse)

x=3.0
y=1.0
idx = inWhichEllipse(x,y,rads)
rx,ry = rads[idx]
ellipse = patches.Ellipse((0,0),rx*2,ry*2,fc='none',ec='blue')    
ax.add_patch(ellipse)

if idx != None:
    circle = patches.Circle((x,y),.1)
    ax.add_patch(circle)

plt.show()
导入matplotlib.pyplot作为plt
将matplotlib.patches导入为修补程序
将numpy作为np导入
其中的def(x、y、rads):
'''
使用(r1,r2)对的列表rads,返回其中的对的索引
点x,y所在。如果索引在all之外,则返回None作为索引
省略号。
'''
xx=x*x
yy=y*y
计数=0
椭圆=0
尽管如此:
rx,ry=拉德[计数]
省略号=xx/(rx*rx)+yy/(ry*ry)
如果ellips<1:
Ith=计数
打破
计数+=1
如果计数>=len(rads):
椭圆=无
打破
返回椭圆
rads=zip(np.arange(.5,10,5),np.arange(.125,2.5,25))
图=plt.图()
ax=图添加_子批次(111)
ax.set_xlim(-15,15)
ax.set_ylim(-15,15)
#绘图椭圆
对于rx,ry,单位为rads:
椭圆=面片。椭圆((0,0),rx*2,ry*2,fc='none',ec='red')
ax.添加补片(椭圆)
x=3.0
y=1.0
idx=inwhichelipse(x,y,rads)
rx,ry=rads[idx]
椭圆=面片。椭圆((0,0),rx*2,ry*2,fc='none',ec='blue')
ax.添加补片(椭圆)
如果idx!=无:
圆=面片。圆((x,y),.1)
ax.添加补片(圆形)
plt.show()
此代码生成下图:


请记住,这只是一个起点。首先,您可以在whichelipse中更改
,以接受r1和r2的平方列表,即(r1*r1,r2*r2)对,这将进一步减少计算量

你会把事情复杂化。根据椭圆的几何定义,不需要计算焦点和到焦点的距离等。如果你知道长轴和短轴(你知道),只需稍微挤压整个问题(例如,通过将x-centerx和y-centery除以xaxis和yaxis,使两者都为1.0),然后问题点是否在椭圆内就是简单的

xnormalized**2 + ynormalized**2 <= 1

xnormalized**2+ynormalized**2这些椭圆的比例和中心相同,我说得对吗?如果是这样,您可以通过例如
r1
来识别它们,并创建一个函数,为每个点指定省略号中该点的最小
r1
。我是对的,还是我只是误解了什么?椭圆是同心的吗?它们的大小是否以固定的比例变化(它们看起来像是同心的)?如果是这样的话,您应该能够通过类似于
dist\u-to\u-point/size\u-per\u-eliple
的内容来判断点落在何处。是的,它们是同心的!但是距离到点/大小到每个椭圆不仅适用于圆吗?@g.d.d.c:这与我所说的类似,只是到点的距离并不能确定它落下时会告诉你什么——更重要的是“纬度”和“经度”对,因为这些椭圆不是圆。没错@g、 在我看来,华盛顿特区的解决方案只适用于圆圈。非常感谢你,这非常有帮助。虽然长轴并不总是x轴…我将在循环中对多组数据执行此操作,因此长轴不一定是x轴。如果轴穿过原始轴,您仍然可以使用单个复数乘法将椭圆问题旋转并缩放为圆问题。此外,如果x,y表示为复数,则距离计算将简化为
abs(p)
+1,我认为@herby比我表达得好得多。这个问题可以大大简化。
xnormalized**2 + ynormalized**2 <= 1