Re: Проверка на проходимость
Posted: 2011-06-20 23:04:59
Можно расширить, если по очереди прибавлять к двум последним числам в строке по 1
То есть так или так выдаст более адекватную линию. Думаю, что зависит от угла отрезка относительно одной из осей. При ровном диагональном отрезке, подойдет 9.
Попробовал ЦДА (цифровой дифференциальный анализатор). Тоже узко на углах...
Code: Select all
If IsInRange(A * x + B * y + C, -3, 3) thenCode: Select all
If IsInRange(A * x + B * y + C, -3, 4) thenCode: Select all
If IsInRange(A * x + B * y + C, -4, 3) thenПопробовал ЦДА (цифровой дифференциальный анализатор). Тоже узко на углах...
Code: Select all
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Именно в этом и проблемма... Но думаю опустить 3d, так как дело будет в лесу и там без лестниц, горок и прочее.Grin wrote:Основная задача построить список затронутых кубов (у нас же все таки трех мерное пространство:) ).
Ок! Точки А(1;1;0) и В(4;3;0), вектор АВ с координатами (3;2;0) и длиной 5 (определено по точкам начала и конца)(С точки А до точки В идти всего 3 шага!!!)Grin wrote:Строится вектор по двум заданным точкам, длинна этого вектора - длинна диагонали параллелепипеда, это очевидно:)
то есть .x = дельтаX/5Grin wrote:Приращение по каждой координате считается как координата вектора деленная на его длину.
Вот тут как раз все совсем не просто. Куда в ЦДА воткнуть эту погрешность? И как воткнуть так, чтобы указывать там реальную длину вектора, а не черезGrin wrote: Ну а дальше все очень просто, с погрешностью в 0.5 выбираются все кубы через которые проходит вектор, в образованном им параллелепипеде:)Координаты кубов - целые числа.
Code: Select all
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