Можно расширить, если по очереди прибавлять к двум последним числам в строке по 1
Code:
If IsInRange(A * x + B * y + C, -3, 3) then
То есть так
Code:
If IsInRange(A * x + B * y + C, -3, 4) then
или так
Code:
If IsInRange(A * x + B * y + C, -4, 3) then
выдаст более адекватную линию. Думаю, что зависит от угла отрезка относительно одной из осей. При ровном диагональном отрезке, подойдет 9.
Попробовал ЦДА (цифровой дифференциальный анализатор). Тоже узко на углах...
Code:
Sub VectorPoints2(startx, starty, endx, endy)
If startx <> endx or starty <> endy then
var Coordinates = ' ' + str(startx) + ' ' + str(starty) + ' ', Lenght = GetVectorLenght(startx, starty, endx, endy)
var dx = (endx - startx) / Lenght, dy = (endy - starty) / Lenght
var x = startx + 0.5 * Sign(dx), y = starty + 0.5 * Sign(dy), i
For i = 1 to Lenght
Coordinates = (Coordinates + str(Integer(x)) + ' ' + str(Integer(y)) + ' ')
x = x + dx
y = y + dy
Next
Return (str(Lenght) + Coordinates)
else
Return 0
Endif
Endsub
Sub GetVectorLenght(startx, starty, endx, endy)
If Absolute(endx - startx) >= Absolute(endy - starty) then
Return Absolute(endx - startx)
else
Return Absolute(endy - starty)
Endif
Endsub
Sub Integer(val)
If int(val + 0.4) > int(val) then
Return int(val) + 1
else
Return int(val)
Endif
Endsub
Sub Absolute(val)
If val > 0 then
Return val
else
Return -val
Endif
Endsub
Sub Sign(val)
If val > 0 then
Return 1
else
If val < 0 then
Return -1
else
Return 0
Endif
Endif
Endsub
Grin wrote:
Основная задача построить список затронутых кубов (у нас же все таки трех мерное пространство:) ).
Именно в этом и проблемма... Но думаю опустить 3d, так как дело будет в лесу и там без лестниц, горок и прочее.
Grin wrote:
Строится вектор по двум заданным точкам, длинна этого вектора - длинна диагонали параллелепипеда, это очевидно:)
Ок! Точки
А(1;1;0) и
В(4;3;0), вектор
АВ с координатами (3;2;0) и длиной 5 (определено по точкам начала и конца)(С точки
А до точки
В идти всего 3 шага!!!)
Grin wrote:
Приращение по каждой координате считается как координата вектора деленная на его длину.
то есть
.x = дельтаX/5Grin wrote:
Ну а дальше все очень просто, с погрешностью в 0.5 выбираются все кубы через которые проходит вектор, в образованном им параллелепипеде:)Координаты кубов - целые числа.
Вот тут как раз все совсем не просто. Куда в ЦДА воткнуть эту погрешность? И как воткнуть так, чтобы указывать там реальную длину вектора, а не через
Code:
Sub GetVectorLenght(startx, starty, endx, endy)
If Absolute(endx - startx) >= Absolute(endy - starty) then
Return Absolute(endx - startx)
else
Return Absolute(endy - starty)
Endif
Endsub