【发布时间】:2020-10-28 22:43:29
【问题描述】:
非常简单,给定一个点 A(x,y) 和另一个点 B(m,n),我需要一个可以在任何可迭代对象中返回其间所有点的列表 [k,z] 的函数。
我只对整数点感兴趣,所以不需要浮点数。
我需要最好的 Pythonic 方式,因为这个“小”功能将被大量运行,并且是更大系统的关键支柱。
编辑:
@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)
【问题讨论】:
-
到目前为止你尝试过什么?你知道如何求解直线方程吗?你不能在一个范围内生成点吗?你被困在哪里了?
-
您必须计算直线的斜率,将其化简为不可约分数,并使用分子/分母作为 x 和 y 的增量。
-
er...很多段将很少/没有点,其中
k和z都是精确整数。即使您确实有整数,某些段也只会有几个精确整数对,而另一些则有很多 - 使得稀疏性高度可变。我认为您还没有完全考虑过这个整数。 -
你在找什么对我来说有点不清楚。您能否为一些简单的输入提供示例输出。例如,
A = (0, 0)、B = (17, 19)的输出应该是什么? -
(a) 做数学并找出你想要实现的算法。 (b) 尝试实施。 (c) 如果您在编程上有困难,请回到这里。
标签: python computational-geometry