私は、行が通過するすべてのセルを走査しようとしています。私はFast Voxel Traversal Algorithmが私のニーズに合うように見えましたが、現在は不正確であると感じています。アルゴリズムが示すボクセル座標としての赤い線と点を持つグラフを下に示します。あなたが見ることができるように、それは(5,6)でなければならないので、(4,7)点を除いてほぼ正しいです。私はアルゴリズムを正しく実装しているかどうかわからないので、Pythonに含めました。だから私は私の質問は、私の実装が正しいと思うか、これには良いアルゴですか?Fast Voxel Traversal 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