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