Это может быть что-то похожее на то, что вы делаете.Я просто смотрю, если 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()
Этот код производит следующий рисунок:
Имейте в виду, это только отправная точка.Во-первых, вы можете изменить inWhichEllipse
так, чтобы он принимал список квадратов пар r1 и r2, то есть (r1 * r1, r2 * r2), и это еще больше сократило бы вычисления.