Я ищу способ проанализировать два кубических сплайна и найти точку, где они находятся ближе всего друг к другу. Я видел много решений и сообщений, но я не смог реализовать предложенные методы. Я знаю, что ближайшей точкой будет одна из конечных точек двух кривых или точка, где первая производная обеих кривых равна. Проверить конечные точки легко. Трудно найти точки, где совпадают первые производные.
Дано:
Curve 0 is B(t) (red)
Curve 1 is C(s) (blue)
Кандидат на ближайшую точку находится где:
B'(t) = C'(s)
Первая производная каждой кривой принимает следующий вид:
Где коэффициенты a, b, c формируются из контрольных точек кривых:
a=P1-P0
b=P2-P1
c=P3-P2
Взяв 4 контрольных точки для каждого кубического сплайна, я могу получить параметрические сечения каждой кривой в матричной форме, которую можно выразить с помощью Numpy с помощью следующего кода Python:
def test_closest_points():
# Control Points for the two qubic splines.
spline_0 = [(1,28), (58,93), (113,95), (239,32)]
spline_1 = [(58, 241), (26,76), (225,83), (211,205)]
first_derivative_matrix = np.array([[3, -6, 3], [-6, 6, 0], [3, 0, 0]])
spline_0_x_A = spline_0[1][0] - spline_0[0][0]
spline_0_x_B = spline_0[2][0] - spline_0[1][0]
spline_0_x_C = spline_0[3][0] - spline_0[2][0]
spline_0_y_A = spline_0[1][1] - spline_0[0][1]
spline_0_y_B = spline_0[2][1] - spline_0[1][1]
spline_0_y_C = spline_0[3][1] - spline_0[2][1]
spline_1_x_A = spline_1[1][0] - spline_1[0][0]
spline_1_x_B = spline_1[2][0] - spline_1[1][0]
spline_1_x_C = spline_1[3][0] - spline_1[2][0]
spline_1_y_A = spline_1[1][1] - spline_1[0][1]
spline_1_y_B = spline_1[2][1] - spline_1[1][1]
spline_1_y_C = spline_1[3][1] - spline_1[2][1]
spline_0_first_derivative_x_coefficients = np.array([[spline_0_x_A], [spline_0_x_B], [spline_0_x_C]])
spline_0_first_derivative_y_coefficients = np.array([[spline_0_y_A], [spline_0_y_B], [spline_0_y_C]])
spline_1_first_derivative_x_coefficients = np.array([[spline_1_x_A], [spline_1_x_B], [spline_1_x_C]])
spline_1_first_derivative_y_coefficients = np.array([[spline_1_y_A], [spline_1_y_B], [spline_1_y_C]])
# Show All te matrix values
print 'first_derivative_matrix:'
print first_derivative_matrix
print
print 'spline_0_first_derivative_x_coefficients:'
print spline_0_first_derivative_x_coefficients
print
print 'spline_0_first_derivative_y_coefficients:'
print spline_0_first_derivative_y_coefficients
print
print 'spline_1_first_derivative_x_coefficients:'
print spline_1_first_derivative_x_coefficients
print
print 'spline_1_first_derivative_y_coefficients:'
print spline_1_first_derivative_y_coefficients
print
# Now taking B(t) as spline_0 and C(s) as spline_1, I need to find the values of t and s where B'(t) = C'(s)
В этом post есть несколько хороших советов высокого уровня, но я не уверен, как реализовать решение на python, которое может найти правильные значения для t и s, которые имеют соответствующие первые производные (наклоны). Проблема B '(t) - C' (s) = 0 кажется вопросом поиска корней. Любой совет о том, как сделать это с Python и Numpy, будет принята с благодарностью.