Как оптимизировать определение границ произвольной фигуры ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как оптимизировать определение границ произвольной фигуры ?

Сообщение Alex2013 » 17.01.2017 18:18:47

И так добрался я до выделения прямоугольника текущей фигуры по клику мыши .
Задача вроде простая тем более что часть работы уже проведана при выборе фигуры ...
То есть сразу есть точка достоверно принадлежащая выбираемой фигуре (+ как, возможно помните, есть растровая маска фигуры )
Пока грубо сделал вот так (код вполне работает но увы недостаточно быстро) :
Код: Выделить всё
// Номер команды по клику
// и поиск границ...
Function GetCMDOnClik(X,Y:Longint):Longint;
Var
B:TBitmap;
C,i,X1,Y1:longint;
R:Trect;
XF,YF:byte;

begin
..
Тут идет не относящийся делу  код для  определения принадлежности  точки конкретной
фигуре...
...
  if b.Canvas.Pixels[X,Y]<>$f2 then
        begin
    //Дополнительно определение границ
    // текущей фигуры
    {-------------------}
    R.Left:=b.Width;R.Top:=b.Height;
    r.Right:=0;r.Bottom:=0;
    YF:=0;// чуть "оптимизации" уже добавил
              // пустые линии не сканирует
             //  но вообще-то это наверное не верное решение
            //  потому что фигура вполне может  иметь разрыв по вертикали
      for Y1:=Y to b.Height-1 do begin
       if YF <>0 then YF:=2;
        for X1:=0 to b.Width-1 do

          if b.Canvas.Pixels[X1,Y1]<>$f2 then
           begin
           YF:=1;
           If Y1<R.Top then R.Top:=Y1;
           If X1<R.Left then R.Left:=x1;
           If X1>R.Right then R.Right:=x1;
           If Y1>R.Bottom then R.Bottom:=Y1;
           end;
          If YF>1 then break;
     end;
      YF:=0;
            for Y1:=Y downto 0 do begin
             if YF <>0 then YF:=2;
              for X1:=b.Width-1 downto 0 do
                if b.Canvas.Pixels[X1,Y1]<>$f2 then
                 begin
                 YF:=1;
                 If Y1<R.Top then R.Top:=Y1;
                 If X1<R.Left then R.Left:=x1;
                 If X1>R.Right then R.Right:=x1;
                 //If Y1>R.Bottom then R.Bottom:=Y1;
                 end;
                If YF>1 then break;
           end;
          CurRec:=R;
          FCurRec:=True;
          Result:=I;
           break;
        end;     


И так первое: что напрашивается для дальнейшей оптимизации это отказ от доступа через канвас
( например можно организовать доступ через RawImage )
Но сомневаюсь что выигрыш в производительности будет значительным .

Второе: механика редактора в принципе позволяет упрятать поиск границ в отдельный поток и не ждать его завершения (если ничего не изменилось использовать данные если изменилось или бросить и запустить поиск по новой или игнорировать полученный результат )

Но мне интересует: нет ли чисто АЛГОРИТМИЧЕСКОЙ ОПТИМИЗАЦИИ подобного поиска ?
:idea:
Alex2013
долгожитель
 
Сообщения: 2938
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение runewalsh » 17.01.2017 18:57:37

Откуда вообще фигура взялась? Раз есть маска и ты как-то узнал, что точка принадлежит фигуре — нельзя там же и информацию о границах хранить? Я, конечно, не очень в теме, что здесь происходит...
Последний раз редактировалось runewalsh 17.01.2017 19:02:42, всего редактировалось 1 раз.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 17.01.2017 19:00:16

и кстати непонятно, зачем хранить ректы в маске? храните их в array of TRect.
скорость вычислений будет мгновенной
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение pupsik » 17.01.2017 19:47:36

Alex2013 детектор углов ?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 17.01.2017 20:09:47

runewalsh писал(а):Откуда вообще фигура взялась? Раз есть маска и ты как-то узнал, что точка принадлежит фигуре — нельзя там же и информацию о границах хранить? Я, конечно, не очень в теме, что здесь происходит...

Тема прямое продолжение этого разговора :
:arrow: viewtopic.php?f=5&t=11071

Фигура из моего "редактора форм-и-страниц" для помощи в создании веб-приложений .
(Что-то вроде редактора форм Лазаруса но для веб )
Предпоследняя сборка тут :
:arrow:viewtopic.php?p=104595#p104595
Последний раз редактировалось Alex2013 17.01.2017 20:24:28, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2938
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение olegy123 » 17.01.2017 20:12:08

Alex2013 писал(а):Но мне интересует: нет ли чисто АЛГОРИТМИЧЕСКОЙ ОПТИМИЗАЦИИ подобного поиска ?
:idea:


Называется это: "Принадлежность точки к многоугольнику"..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 17.01.2017 20:28:20

olegy123 писал(а):
Alex2013 писал(а):Но мне интересует: нет ли чисто АЛГОРИТМИЧЕСКОЙ ОПТИМИЗАЦИИ подобного поиска ?
:idea:


Называется это: "Принадлежность точки к многоугольнику"..


С "принадлежностью точки" все уже давно в порядке ...
Теперь мне нужно по возможности БЫСТРО получить "рамочку вокруг произвольной фигуру "
То есть минимальное и максимальное значение координат X и Y для точек составляющих фигуру :idea:

Добавлено спустя 13 минут 59 секунд:
vitaly_l писал(а):и кстати непонятно, зачем хранить ректы в маске? храните их в array of TRect.
скорость вычислений будет мгновенной

??? :roll: (Или я что-то не понял или вы не вникли ...)
"Маска" просто Битмап с двухцветным изображением.
там TRect один ... по сути задача на выделение границ произвольного спрайта в произвольном месте экрана .
Alex2013
долгожитель
 
Сообщения: 2938
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 17.01.2017 20:44:06

Если есть маска отрисовки, то, возможно, проще будет посчитать сумму столбцов, а потом строк.
Смысл тот, что как только появляется граница фигуры, то сумма строки/столбца изменится. Для ускорения, можно при этом перейти к другому краю.

Если, фон маски прозрачный, то можно вообще сканировать на наличие ненулевых значений. Ну есть еще резервы в том, что можно проверять сумму не каждой строки, а с определенной периодичностью, а уж при первом пересечении с фигурой тупо проверить пропущенные строки/столбцы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 17.01.2017 20:48:57

Кстати интересно, а сильно ли ускорит процесс конвертация маски в однобитовый формат ? :idea: :roll:
Последний раз редактировалось Alex2013 17.01.2017 21:04:42, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2938
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 17.01.2017 21:00:06

Alex2013, существенно.

Добавлено спустя 1 минуту 12 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Если, действительно будет соотношение одна точка на один бит.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 17.01.2017 21:01:49

Лекс Айрин писал(а):Если есть маска отрисовки, то, возможно, проще будет посчитать сумму столбцов, а потом строк.
Смысл тот, что как только появляется граница фигуры, то сумма строки/столбца изменится. Для ускорения, можно при этом перейти к другому краю.

Как-то сомнительно что суммирование будет быстрее обычной проверки
Если, фон маски прозрачный, то можно вообще сканировать на наличие ненулевых значений. Ну есть еще резервы в том, что можно проверять сумму не каждой строки, а с определенной периодичностью, а уж при первом пересечении с фигурой тупо проверить пропущенные строки/столбцы.

Маску можно сделать прозрачной ... но смысл этого действия от меня ускользает... вместо пропуска строк вполне реально сделать например "4-х кратный стреч" (банально уменьшить картинку в четыре раза - там-же при масштабировании вроде применяется банальное сложение по OR ) !
О это ИДЕЯ :idea:
Спасибо что натолкнули !
Зы
Ушел проверять ... :arrow:
Последний раз редактировалось Alex2013 17.01.2017 21:09:30, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2938
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 17.01.2017 21:08:52

Alex2013, я бы не советовал масштабировать картинку для поиска границ изображения... к сожалению, точность вряд ли будет соответствовать нужной. К тому же обход картинки делается быстрее, чем ее уменьшение

Alex2013 писал(а): но смысл этого действия от меня ускользает...


Все дело в переполнении. При нулевом фоне им можно пренебречь (даже если оно будет, то это лишь укажет на появление края фигуры).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение olegy123 » 17.01.2017 21:20:29

Alex2013 писал(а): //Дополнительно определение границ
// текущей фигуры

WTF?.. зачем?

Alex2013 писал(а):// чуть "оптимизации" уже добавил
// пустые линии не сканирует
// но вообще-то это наверное не верное решение
// потому что фигура вполне может иметь разрыв по вертикали

Это что такое? типа Фотошоп версии 0.1 под Intel 80286, без математического сопроцессора потому что он очень дорог.. где решалось как закрасить произвольный многоугольник в EGA мониторе нахождением границ фигуры путем сканирования по вертикали и горизонтали пикселей.. и не в один проход..

Alex2013, щас все решается разбиением на простые фигуры.. посмотри что такое тессаляция.
Последний раз редактировалось olegy123 17.01.2017 22:29:51, всего редактировалось 1 раз.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 17.01.2017 21:27:54

olegy123, для этого придется создавать OpenAl контекст, а, как я понял, речь идет о программе работающей вне его.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение olegy123 » 17.01.2017 21:56:11

Лекс Айрин писал(а):OpenAl
Может OpenGL?
https://en.wikipedia.org/wiki/Tessellation

Нет тесселяция - это геометрический способ упрощения построения примитивами (треугольниками) сложных объектов (3D/2D)..

Добавлено спустя 53 минуты 27 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Alex2013, перестань изобретать то, что уже давно пройдено..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru