python рисование линии, обозначающей две линии - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы знать, как плавно провести линию поверх двух линий, которые у меня есть. Возьмем, к примеру, следующий код:

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 4]
x2, y2 = [1, 10], [3, 2]
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

Я хотел бы провести линию от верхней оранжевой точки вниз до синей линии, где они пересекаются, и до верхней правой синей точки. Я хочу, чтобы эта линия была желательно ровной. Как мне это сделать?

Я думал, что могу сделать массив оранжевой линии синей, а затем иметь массив синей линии до синей точки. Затем я бы провел здесь черту, но это довольно грубое решение. Я не уверен, что могу сделать что-то более умное.

Также было бы хорошо знать, как обобщить это до сглаженных линий (вот почему мне не нужно это решение с массивом). Заранее спасибо.

1 Ответ

1 голос
/ 10 июля 2020

сначала нужно рассчитать пересечение линий. Я привел вам пример, как это сделать. Функция draw_smooth_line проведет плавную линию между 3 точками. Вы можете добавить logi c для получения лучших очков из вашего списка, если вам это нужно.

import matplotlib.pyplot as plt
from scipy.ndimage.filters import gaussian_filter1d
import numpy as np 
from scipy.interpolate import interp1d



def draw_smooth_line(left_x, left_y, mid_x, mid_y, right_x, right_y):
    x = [left_x, mid_x, right_x]
    y = [left_y, mid_y, right_y]
    x_new = np.linspace(left_x, right_x,500)
    f = interp1d(x, y, kind='quadratic')
    y_smooth=f(x_new)
    plt.plot (x_new,y_smooth)


def findIntersection(x1,y1,x2,y2,x3,y3,x4,y4):
    px= ( (x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4) ) / ( (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4) ) 
    py= ( (x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4) ) / ( (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4) )
    return [px, py]

x1, y1 = [-1, 12], [1, 4]
x2, y2 = [1, 10], [3, 2]

x3, y3 = findIntersection(x1[0],y1[0],x1[1],y1[1],x2[0],y2[0],x2[1],y2[1])

draw_smooth_line(x1[1], y1[1], x3, y3, x2[0], y2[0])

plt.plot(x1, y1, x2, y2, x3, y3, marker = 'o')

plt.show()

Вот результат

результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...