Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм поиска путей, нечто вроде Lines :), Долбусь над этой гадостью уже с неделю 
:(
    Опции темы
vintch
  Дата 24.4.2005, 21:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Приветствую!
Самое первое - данная тема посвящяется алгоритму поиска путей, схожим с алгоритмом игры Lines.
У меня кое-что получилось, но... ФИГНЯ!
Вобщем суть такая: есть что-то вроде плана квартиры. Стены нарисованы clBlack'ом на clWhite'е smile
Всё это загружено в простой TImage. Если точнее - TBitmap;
Вот, теперь, есть две точки - А и В. Мне нужно построить алгоритм,
который будет строить ломаную из точки А в точку В, обходящую стены, нарисованые чёрным цветом (напоминаю smile

Вот мой листинг, код, признаюсь, тупее некуда, но он кое-как работает smile

Код
var
  Form1: TForm1;
  Def: TBitmap;
  C: Integer=-1;
  pA,pB: TPoint;
  FirstPoint: Boolean=TRUE;
  stopped: boolean;
  a,b: array[0..377, 0..225] of TBit;


procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

var
  TX, TY, AX, AY, BX, BY, I: Integer;
  TheEnd: Boolean;
  V: Byte;
  DM, DM_I, St: Integer;
  Points: array[0..7] of TPoint;  // 111   123
                                                 // 101   4X5
                                                 // 111   678
procedure DStep(x,y: Integer);
begin
   Form1.Image1.Canvas.Ellipse(X-5, Y-5, X+5, Y+5);
end;

procedure DLine(x1,y1,x2,y2: Integer);
begin
   Form1.Image1.Canvas.MoveTo(x1,y1);
   Form1.Image1.Canvas.LineTo(x2,y2);
end;

function Distance(x1,y1,x2,y2: LongInt): LongInt;
begin
   Result := Round(Sqrt(Sqr(x1-x2)+Sqr(y1-y2)));
end;

procedure Find(x,y: Integer);
begin

end;

{
          Image1.Canvas.MoveTo(pA.X, pA.Y);
          Image1.Canvas.LineTo(pB.X, pB.Y);
          Image1.Canvas.Pen.Color := clGreen;
          Image1.Canvas.MoveTo(pA.X, pA.Y);
          Image1.Canvas.LineTo(pB.X, pA.Y);
          Image1.Canvas.LineTo(pB.X, pB.Y);
}

begin
Image1.Canvas.Ellipse(X-5, Y-5, X+5, Y+5);
if CheckBox1.Checked then begin
inc©;
case c of
 0: begin pA.X := X; pA.Y := Y; end;
 1: begin pB.X := X; pB.Y := Y;
 //=====================================
       for tx:=0 to 377 do
        for ty:=0 to 225 do
         if def.canvas.Pixels[tx,ty] = clBlack then
          a[tx,ty] := 1
         else
          a[tx,ty] := 0;
       for tx:=0 to 377 do
        for ty:=0 to 225 do
         b[tx,ty] := 0;
       bx := pB.X;
       by := pB.Y;
       ax := pA.X;
       ay := pA.Y;
       TX := ax;
       TY := ay;
       //Form1.Memo1.Lines.Add(format('BX: %d BY: %d AX: %d AY: %d ; Distance: %d', [bx,by,ax,ay,distance(ax,ay,bx,by)]));
       I:=0;
       DM := 0;
       DM_I := 0;
       St := 1;
       stopped := false;
       repeat
           for I:=0 to 7 do
            begin Points[I].X := -1; Points[I].Y := -1; end;

           Points[0].X := TX-St; //1
           Points[0].Y := TY-St; //1

           Points[1].X := TX;   //2
           Points[1].Y := TY-St; //2

           Points[2].X := TX+St; //3
           Points[2].Y := TY-St; //3

           Points[3].X := TX-St; //4
           Points[3].Y := TY;   //4

           Points[4].X := TX+St; //5
           Points[4].Y := TY;   //5

           Points[5].X := TX-St; //6
           Points[5].Y := TY+St; //6

           Points[6].X := TX;   //7
           Points[6].Y := TY+St; //7

           Points[7].X := TX+St; //8
           Points[7].Y := TY+St; //8

           DM := 0;

           for I:=0 to 7 do
            if a[Points[I].X, Points[I].Y] = 1 then
            begin
             Points[I].X := -1; Points[I].Y := -1;
             Inc(DM);
            end;

           Application.ProcessMessages;

           if DM >= 8 then
            begin
               Form1.Memo1.Lines.Add('Ошибка! Путь не найден!');
               Inc(St);
               if stopped then break;
               if st > 10 then Break;
               Continue;
            end;

           DM := 32767;

           for I:=0 to 7 do
            if Distance(Points[I].X, Points[I].Y, bx, by) < DM then
             begin
                DM := Distance(Points[I].X, Points[I].Y, bx, by);
                DM_I := I;
             end;

           a[TX,TY] := 1;

           TX := Points[DM_I].X;
           TY := Points[DM_I].Y;

           b[TX,TY] := 1;

       until ((tx = bx) and (ty = by)) or stopped;
       Form1.Memo1.Lines.Add('ok');
 //=====================================
          C := -1;
       for TX := 0 to 377 do
        for TY := 0 to 225 do
         if b[tx,ty] = 1 then
          Image1.Canvas.Pixels[TX,TY] := clGreen;
    end;
end;
end else
begin
if FirstPoint then
 Image1.Canvas.MoveTo(X,Y)
else
 Image1.Canvas.LineTo(X,Y);
FirstPoint := FALSE;
end;
end;


В переменную Def загружается картинка из TImage, а в TImage она установлена ещё с Object Inspector'а.
Ломаная - траектория движения.

Я ещё буду мучаться, но незнаю что у меня получится.

Цель всего этого - небольшая часть большой программы, которая должна будет управлять домашним роботом, которого
ещё пока нету smile

Кто чем может, помогите люди!!! У меня мАзгов на ето не хватает!!!

Цитата
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit.
- мне понравилось smile

Это сообщение отредактировал(а) Girder - 25.4.2005, 01:15
  Вверх
SPrograMMer
Дата 24.4.2005, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6



smile
Цитата(vintch @ 24.4.2005, 21:00)
мне понравилось

ну тада регистрируйся! не боись нечего страшного там нет, и

По сабжу:
с твоим листнгом не разбирался - много сильно понаписано, без комментариев... smile Ты про волновой алгоритм знаешь - почти наилучшее решение твоей задачи. Поисчи в разделе "Алгоритмы" там с месяц назад игра "Сапёр" обсуждалась, там кажись и про волновой агоритм че-то было smile

Это сообщение отредактировал(а) Girder - 25.4.2005, 01:17


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Albinos_x
Дата 24.4.2005, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: нет
Всего: 108



почитай полезно, есть много интересного и на твой вопрос
жми сюда


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
vintch
Дата 25.4.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 24.4.2005

Репутация: нет
Всего: нет



Цитата
ну тада регистрируйся! не боись нечего страшного там нет

Дык уже зарегился!
За советы спасибо, щас смотреть буду smile
PM MAIL   Вверх
EKoshelev
Дата 27.4.2005, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Может быть реплика немного не в тему... Если бы такую прогу писали именно для робота, то, думаю, можно было бы немного попыхтеть и задать карту не .bmp, а как совокупность каких-нибудь зон (локаций).

А если по волновому, то могу полуполезный совет предложить. Если формат картинки достаточно большой, то, возможно, есть смысл её уменьшить. Только так, чтобы стены не проподали и не срастались в месте проходов.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
vintch
Дата 27.4.2005, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 24.4.2005

Репутация: нет
Всего: нет



Да, я с Вами полностью соглашаюсь! smile

Я нашёл в инете полное описание этого алгоритма, написал, работает.
НО! Он совершенно не такой эффиктивный, как его разрекламировали!!! Он находит путь примерно в 25-35% случаев!
И при этом, он работает только если координаты начальной точки меньше координат конечной! Но это я кажется знаю как исправить. Мой алгоритм, что весьма интересно, работает раз в 10-20 быстрее, но он также не эффиктивен. Но зато, такой финт: если не работает первый алгоритм, то работает второй, и наоборот. (!!!) Карту уменьшать не собираюсь, мне это просто не подходит по ряду причин. А вот про алгоритмы, у меня появилась ещё идея, smile попробую реализовать. smile И плюс к этой идеи, я ещё припишу оба алгоритма, так, чтобы они выполнялись в последовательности от самого быстрого к самому медленному. Итог - если самый быстрый алгоритм не нашёл пути, его найдёт более сложный, и более медленный. Таким образом я постараюсь уменьшить время выполнения уже "обобщённого" алгоритма, и увеличить вероятность правильного ответа до 85-95% smile Если у меня что-нибудь получится, обязательно расскажу как я это сделал, и выкину полный проект в архиве. smile smile smile
PM MAIL   Вверх
EKoshelev
Дата 4.5.2005, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



vintch Не правильно пишешь слово "эффективен"


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.