procedure TLinePainter.PaintLine;
var
i,path:integer;
v:real;
x,y:integer;
begin
i:=abs(Start.X - Finish.X);
path:=abs(Start.Y - Finish.Y);
if path<i then path:=i;
if path=0thenexit;
for i:=0to path dobegin
v:=(i / path);
x:=Start.x + Round((Finish.x - Start.x) * v);
y:=Start.y + Round((Finish.y - Start.y) * v);
Form.Scene.Canvas.Pixels[x,y]:=clBlack;
end;
end;
первая линия на рисунке - нарисованая этой функцией, а вторая - так как надо нарисовать.
проще гря надо рисовать линию которая не может по-диагонали двигатся
if (x<>x1) and (y<y1) then Form.Scene.Canvas.Pixels[x-1,y]:=clBlack;
if (x<>x1) and (y>y1) then Form.Scene.Canvas.Pixels[x+1,y]:=clBlack;
if (y<>y1) and (x<x1) then Form.Scene.Canvas.Pixels[x,y+1]:=clBlack;
if (y<>y1) and (x>x1) then Form.Scene.Canvas.Pixels[x,y-1]:=clBlack;
Form.Scene.Canvas.Pixels[x,y]:=clBlack;
x1:=x;
y1:=y;
Последний раз редактировалось Xa4ik, 19.04.2011 в 17:09.
сомнительно... Внимательно посмотри на рисунок, если именно 1 в 1 как у него... то на втором рисунке точка(3,5) должна быть в (4,4), если толщиной в 2 пикселя строить...
Если это тупо рисование пути (и ничего больше), то там только попиксельно (или извратиться с поиском прямых отрезков параллельно осям коодинат)
Тебе это именно для рисования, или все таки имеет отношение к поиску пути?)))
сомнительно... Внимательно посмотри на рисунок, если именно 1 в 1 как у него... то на втором рисунке точка(3,5) должна быть в (4,4), если толщиной в 2 пикселя строить...
Если это тупо рисование пути (и ничего больше), то там только попиксельно (или извратиться с поиском прямых отрезков параллельно осям коодинат)
мне надо проверять, если то одной точки до второй точки можно провести прямую и на этом отрезке нет препятствий - удаляем вторую точку и так со всеми, короче из массива точек отобрать только нужные
supernewbie, а что ты конструируешь такое? А то у тебя постоянно геометрические впросы, аж интересно...
(Если ответ: "Иди ёбни ломату дерьма убейся", то я пойму)
дык алгоритм пути по геодате, сам путь есть в виду координат, надо отрезать лишние точки, чтобы посылать мув то локейшен только в точки в которые можно провести прямую линию и на ней не будет препятствий, для этого сначала эту прямую линию надо провести)
Добавлено через 2 минуты
памагите пасаны
__________________ Начало.
Последний раз редактировалось supernewbie, 19.04.2011 в 18:53.
Причина: Добавлено сообщение
дык алгоритм пути по геодате, сам путь есть в виду координат, надо отрезать лишние точки, чтобы посылать мув то локейшен только в точки в которые можно провести прямую линию и на ней не будет препятствий, для этого сначала эту прямую линию надо провести)
Добавлено через 2 минуты
памагите пасаны
Так тут все более чем просто... Путь не является прямой линией, поэтому мысль с построением линии без диагональных переходов - как-то бредова))
Суть такая:
Код:
coord A = CurrentCoord();
coord B = CurrentCoord();
while (A != EndPoint) {
bool Flag = false, ShiftX=false, ShiftY=false;
while (!Flag) {
if(A.x != B.x) ShiftX=true;
if(A.y != B.y) ShiftY=true;
if(B == EndPoint) Flag = true;
if (ShiftX && ShiftY) {
Flag = true;
B = PrevPoint();
}
else B = NextPoint();
}
moveto(B);
A = B;
}
эт если я правильно понял что тебе надо)
Т.е. мы строим прямую линии до ближайшего диагонального перехода, идем к нему, от него начинаем строить дальше и т.д.... Если нужно изначально все точки просто пробить, то вместо moveto(B) записывай себе куда-нить эту координату и все
Добавлено через 6 минут
Цитата:
Сообщение от mira
он боитса что диагональная линия пути проскочит между двумя такимиже диагональным пикселами геодаты как я понимаю) и получитса типа как итти можно.
нет, как я понял, у него путь готовый есть уже) просто ему нужно сделать координаты контрольных точек, чтоб не писать MoveTo на каждую точку пути)))
хотя мб я как всегда не допонял что-то))
А если ты прав, то это говорит о том, что выбранный алгоритм для поиска пути заведомо неверный, раз ищет не в 4 направления, а в 8)))
Последний раз редактировалось Aries, 19.04.2011 в 19:26.
Причина: Добавлено сообщение
у него путь готовый есть уже) просто ему нужно сделать координаты контрольных точек, чтоб не писать MoveTo на каждую точку пути)))
вот именно так, есть массив точек xyz пути, надо удалить лишние посредством провода прямых линий, а в геодате по диагонали нельзя двигатса
Добавлено через 1 минуту
Цитата:
Сообщение от mira
а ты попробуй рисавать еще 1 линию вплотную к этой со сдвигом в один пиксель. если обе линии проходят то вперед, пока в мою светлую голову не приходит ничего другова ))
но это хренова :\ так лишние точки будут задействованы и тупить всё будет
вот на рисунке - синие точки это все точки из массива точек пути, бордовым отмечено какие точки должны остатся путём провода линий и узнавания что можно валить нанапрямую
__________________ Начало.
Последний раз редактировалось supernewbie, 19.04.2011 в 19:39.
Причина: Добавлено сообщение