Очень просто, учитывая точку A (x, y) и другую точку B (m, n), мне нужна функция, которая может возвращать в любом итерируемом объекте список [k, z] всех точек между ними.Получить все точки прямой линии в python
Меня интересуют только целые точки, поэтому нет необходимости в поплавках.
Мне нужен наилучший возможный пифонический путь, потому что эта «маленькая» функция будет сильно запущена и является ключевым столпом более крупной системы.
EDIT:
@roippi, спасибо, указывая вне Гоча относительно целых чисел. Из моего кода ниже вы можете увидеть, что я пытаюсь перейти по оси x и получить соответствующий y, а затем сделать то же самое для y. Мой набор точек, не будет иметь никакой недискретную координатную точку, так что на данный момент я могу позволить себе упустить из вида, что небольшой недостаток
import itertools
#Vars
origin = {'x':0, 'y':0}
def slope(origin, target):
if target['x'] == origin['x']:
return 0
else:
m = (target['y'] - origin['y'])/(target['x'] - origin['x'])
return m
def line_eqn(origin, target):
x = origin['x']
y = origin['y']
c = -(slope(origin, target)*x - y)
c = y - (slope(origin, target)*x)
#return 'y = ' + str(slope(target)) + 'x + ' + str(c)
m = slope(origin, target)
return {'m':m, 'c':c}
def get_y(x, slope, c):
# y = mx + c
y = (slope*x) + c
return y
def get_x(y, slope, c):
#x = (y-c)/m
if slope == 0:
c = 0 #vertical lines never intersect with y-axis
if slope == 0:
slope = 1 #Do NOT divide by zero
x = (y - c)/slope
return x
def get_points(origin, target):
coord_list = []
#Step along x-axis
for i in range(origin['x'], target['x']+1):
eqn = line_eqn(origin, target)
y = get_y(i, eqn['m'], eqn['c'])
coord_list.append([i, y])
#Step along y-axis
for i in range(origin['y'], target['y']+1):
eqn = line_eqn(origin, target)
x = get_x(i, eqn['m'], eqn['c'])
coord_list.append([x, i])
#return unique list
return list(k for k,_ in itertools.groupby(sorted(coord_list)))
origin = {'x':1, 'y':3}
target = {'x':1, 'y':6}
print get_points(origin, target)
Что вы пробовали? Вы знаете, как решить уравнение линии? Можете ли вы не создавать точки в диапазоне? Где вы застряли? – CoryKramer
Вы должны вычислить наклон линии, уменьшить ее до неприводимой доли и использовать числитель/знаменатель как приращения для x и y. –
er ... у многих сегментов будет очень мало/нет точек, где оба 'k' и' z' являются точными целыми числами. Даже если у вас есть целые числа, некоторые сегменты будут иметь только несколько пар с точным целым числом, тогда как другие - много, что делает разреженность сильно переменной. Я не думаю, что вы полностью это продумали. – roippi