Я пытаюсь пройти через все ячейки, через которые проходит линия. Я нашел Fast Voxel Traversal Algorithm, который, похоже, соответствует моим потребностям, но сейчас я нахожусь неточным. Ниже приведен график с красной линией и указывает координаты воксела, которые дает алгоритм. Как видите, это почти правильно, за исключением точки (4, 7), как и должно быть (5,6). Я не уверен, правильно ли я реализую алгоритм, поэтому включил его в Python. Итак, я думаю, мой вопрос заключается в том, что моя реализация правильная или есть лучший алгоритм для этого?Быстрый обзор Voxel 2D
Благодаря
def getVoxelTraversalPts(strPt, endPt, geom):
Max_Delta = 1000000.0
#origin
x0 = geom[0]
y0 = geom[3]
(sX, sY) = (strPt[0], strPt[1])
(eX, eY) = (endPt[0], endPt[1])
dx = geom[1]
dy = geom[5]
sXIndex = ((sX - x0)/dx)
sYIndex = ((sY - y0)/dy)
eXIndex = ((eX - sXIndex)/dx) + sXIndex
eYIndex = ((eY - sYIndex)/dy) + sYIndex
deltaX = float(eXIndex - sXIndex)
deltaXSign = 1 if deltaX > 0 else -1 if deltaX < 0 else 0
stepX = deltaXSign
tDeltaX = min((deltaXSign/deltaX), Max_Delta) if deltaXSign != 0 else Max_Delta
maxX = tDeltaX * (1 - sXIndex + int(sXIndex)) if deltaXSign > 0 else tDeltaX * (sXIndex - int(sXIndex))
deltaY = float(eYIndex - sYIndex)
deltaYSign = 1 if deltaY > 0 else -1 if deltaY < 0 else 0
stepY = deltaYSign
tDeltaY = min(deltaYSign/deltaY, Max_Delta) if deltaYSign != 0 else Max_Delta
maxY = tDeltaY * (1 - sYIndex + int(sYIndex)) if deltaYSign > 0 else tDeltaY * (sYIndex - int(sYIndex))
x = sXIndex
y = sYIndex
ptsIndexes = []
pt = [round(x), round(y)]
ptsIndexes.append(pt)
prevPt = pt
while True:
if maxX < maxY:
maxX += tDeltaX
x += deltaXSign
else:
maxY += tDeltaY
y += deltaYSign
pt = [round(x), round(y)]
if pt != prevPt:
#print pt
ptsIndexes.append(pt)
prevPt = pt
if maxX > 1 and maxY > 1:
break
return (ptsIndexes)
Вы можете попробовать просить об этом на https://codereview.stackexchange.com – Richard
Я реализовал этот алгоритм много лет назад, и он работал хорошо. Это непросто сравнивать, потому что (кажется) вы используете целые центрированные вокселы. Когда я отлаживал, я регистрировал ввод параметров и координат для каждой касательной ячейки. – MBo
@MBo: Я использовал ваш предыдущий ответ на другой вопрос, чтобы начать меня. Спасибо за это. Если я правильно ее реализовал, и это похоже на то, что я сделал. Алго будет пропускать клетки. Похоже, это дает довольно хорошее покрытие, хотя – Vinh