gt22

Интерполяция

Nov 22nd, 2018
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.99 KB | None | 0 0
  1. # Считываем известные точки, и точки для которых нужно найти ответ
  2. dots, questions = eval(input())
  3. # Создаём массив ответов
  4. ans = []
  5. # для каждого вопроса...
  6. for q in questions:
  7.     # Считаем расстояние до каждой из известных точек, и сохраняем в формате (x, y, distance)
  8.     data = [(x, y, abs(x - q)) for x, y in dots]
  9.     # Сортируем их по расстоянию, по умолчанию в начале окажутся точки с меньшим расстоянием
  10.     sorted_data = sorted(data, key=lambda x: x[2])
  11.     # Мы не можем быть уверенны что две ближайшие точки не лежат с одной стороны
  12.     # поэтому нам надо найти ближайшии с разных сторон
  13.  
  14.     # Находим точку справа:
  15.     right_i = 0
  16.     # Проверяем, если точка лежит слева от вопроса, пробуем следующию, и так пока не окажется справа
  17.     # Таким образом получаем ближайшую точку справа
  18.     while sorted_data[right_i][0] < q:
  19.         right_i += 1
  20.     # Всё то-же самое, только слева
  21.     left_i = 0
  22.     while sorted_data[left_i][0] > q:
  23.         left_i += 1
  24.  
  25.     # Достаём наши точки, расстояние нам больше не надо, так-что выкидываем
  26.     right_x, right_y, _ = sorted_data[right_i]
  27.     left_x, left_y, _ = sorted_data[left_i]
  28.     # Чистая математика
  29.     dx = right_x - left_x
  30.     dy = right_y - left_y
  31.     k = dy / dx
  32.     b = left_y - (k * left_x)
  33.     # Добавляем ответ в массив
  34.     ans.append((k * q) + b)
  35.  
  36. # Выводим наши ответы
  37. print(ans)
  38.  
  39.  
  40.  
  41. Шутка на тему:
  42. https://xkcd.com/605/
Advertisement
Add Comment
Please, Sign In to add comment