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值将椭圆问题简化为圆问题
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