Найдите пересечение между кривой параметрического сплайна и линией

Я подбираю кривую параметрического сплайна (t) из набора точек (x, y) выборки. Как вычислить точку пересечения с линией, заданной наклоном и одной точкой? В моем особом случае сплайн пересекается с линией один раз или не пересекается вообще, но никогда не пересекается несколько раз.

Вот код для сплайна и линии...

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate


# Fit spline from points
x = np.array([152, 200, 255, 306, 356, 407, 457, 507, 561, 611, 661, 711, 761, 811, 861])
y = np.array([225, 227, 229, 229, 228, 226, 224, 222, 218, 215, 213, 212, 212, 215, 224])
tck, u = interpolate.splprep((x, y), k=3, s=1)

# Plot it...
u = np.linspace(0, 1, 100)
xy = np.asarray(interpolate.splev(u, tck, der=0))
plt.plot(*xy)


# Line defined by slope and (x, y) point
m = 3
(x, y) = (500, 100)

# Plot it...
x_vals = np.array([400, 700])
y_vals = m * (x_vals - x) + y
plt.plot(x_vals, y_vals)
plt.show()

... который выглядит так: Сюжет


person sonovice    schedule 27.07.2020    source источник


Ответы (1)


Добавьте следующие строки

from scipy.interpolate import interp1d
spline = interp1d(xy[0], xy[1]) # define function based on spline data points
line = interp1d(x_vals, y_vals) # define function based on line data points

import scipy.optimize as spopt
f = lambda x: spline(x) - line(x) # difference function, its zero marks the intersection
r = spopt.bisect(f, a = max(xy[0][0], x_vals[0]), b = min(xy[0][-1], x_vals[-1])) # find root via bisection

plt.scatter(r, spline(r))
print(r, spline(r))
plt.show()

Сначала определите функции для вашего сплайна и линии на основе их данных. Корень разностной функции f отмечает ваше пересечение. Так как существует только один, деление пополам прекрасно работает, чтобы найти его.

Вероятно, было бы более правильно как-то повторно использовать splev для определения функции для сплайна, но я оставлю это вам.

person Peter Meisrimel    schedule 27.07.2020