Я думаю, что 3d Bresenham - это то, что вам нужно, только немного подправили. В качестве первого шага к проблеме действуйте как Брезенхэм, но будьте подозрительны, когда собираетесь сделать шаг или вы только что сделали шаг, так как это места, где линия может проходить через лишние ячейки.
Для простоты предположим, что z
является доминирующим, что означает, что z
увеличивается на каждый шаг. 3-й вопрос Брезенхема: «когда мы увеличиваем / уменьшаем x
или y
?» Ответ: когда накопленная ошибка в x
достигает 0,5, или когда ошибка в y
достигает, либо и то, и другое.
В вашем случае, я думаю, вам нужен вторичный порог, который использует slopeY = deltaY/deltaZ
, чтобы определить, собирается ли линия перейти в соседнюю ячейку. Если stepZ
- это изменение z вдоль линии для каждого пикселя, то такой тест, как error > .5 - slopeY/stepZ
, должен указать вам, что ячейки должны быть по обе стороны от линии в y
. Аналогичный тест покажет вам, нужно ли вам получить дополнительную ячейку в x
. Если вам нужно получить дополнительную ячейку как в x, так и в y, тогда вы должны также получить диагональ ячейки к ячейке Брезенхема.
Если вы обнаружили, что добавили ячейку в y
до приращения, вы не добавите ячейку после. Если вы не добавляли y
ячейку раньше, вам придется добавить ее после, если только вы не прошли через угол ячейки. Как вы справитесь с этим, зависит от вашего варианта использования.
Это мои мысли по этому поводу, я ничего не тестировал, но что-то вроде должно работать.
person
Codie CodeMonkey
schedule
12.05.2013