Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти точку перегиба полилинии, если отрезки ортогональные 
:(
    Опции темы
zvyagaaa
  Дата 8.5.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте уважаемые.
Разбираюсь с рисованием и вычислением пути от точки до точки с препятствиями
user posted image В принципе получается, но есть одно но - массив точек получившейся линии имеет вид 
Код

127;72
116;72
105;72
105;61
105;50
116;50
127;50
138;50
149;50
160;50
160;61
160;72
160;83
160;94
149;94
138;94

т.е. идет рисование по клеточкам. Все бы ничего, но надо в точках, где линия меняет направление с горизонтального на вертикальный и наоборот , например, точки с координатами 105;72, 160;50 установить метки. Вот подкоркой понимаю, что надо просто массив координат отсортировать - но как реализовать не пойму.
Выручайте, пожалуйста.
PM MAIL   Вверх
Mechanic
Дата 8.5.2009, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

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



А не нужно ничего сортировать. smile
Просто нужно исследовать массив последовательно в направлении рисования линии, анализируя напрвление движения.
Например

Код

type
  TPointArray = array of TPoint;
  TDirection = (dNone, dVertical, dHorizontal, dDiagonal);

var

  Path: TPointArray;
  LastDir: TDirection;
  LastDot: TPoint;

function WasDirectionChanged(const aDot: TPoint): boolean;
var CurDir: TDirection;
begin
  //get direction from last dot
  if (aDot.x = LastDot.x) and (aDot.y = LastDot.y) then
    CurDir := dNone
  else
  if (aDot.x = LastDot.x) and (aDot.y <> LastDot.y) then
     CurDir := dVertical
  else
    if (aDot.x <> LastDot.x) and (aDot.y = LastDot.y) then
      CurDir := dHorizontal
    else
      CurDir := dDiagonal;
   //check change
   Result := LastDir <> CurDir;
  //store for next use
  LastDir := CurDir;
  LastDot := aDot;
end;

var
  n: integer;

//if Length(Path) > 0

//first one. Init
LastDot := Path[Low(Path)]; LastDir := dNone;
//scan
for n := Low(Path) to High(Path) do
  if WasDirectionChanged(Path[n]) then
    //mark this dot as corner one


Это не самый оптимальный код, зато наглядный. smile

А что касается "вычислением пути от точки до точки с препятствиями", то тут не совсем ясно, ищется ли маршрут, или измеряется длина уже готового пути.
Если ищется маршрут, то можно использовать алгоритм A*, или подобный. А если мерять длину, то принцип тот же - последовательно складывать длины отрезков.
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
AntonN
Дата 9.5.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



следить за сменой направления движения, банальное if(x_old<>x_new) наверное подойдет smile


--------------------
user posted image
PM MAIL WWW   Вверх
zvyagaaa
Дата 9.5.2009, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Mechanic, 
огромное спасибо за код, это именно то, что мне нужно.
А ищу путь методом Ли (волновой алгоритм), измерять пройденный путь не требуется пока. Хотя тут алгоритм для меня прозрачный
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


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

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


 




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


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

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