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

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

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

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

Сообщение Alex2013 » 18.01.2017 02:53:39

Во-первых сравнение с фотошопом почти комплимент .. (который я пока не заслужил :wink: ) во вторых даже тот "самый фотошоп" тоже реально когда-то был когда-то алфа и бета версии … :idea:
(Я кстати, ещё с альфа версий не спрыгнул проект довольно объёмистый выходит
:arrow: viewtopic.php?f=9&t=10941
Всему толкаемому мной в одиночку проекту "Веб-2" " чуть меньше года, а редактор с перерывами в разработке и того меньше где-то с апреля мая пошлого года... )

Но для тех кто "на танке" (или " рацию на бронепоезде забыл") :D :

1 Такого функционала я обнаружил не у одного «давно пройденного пакета» .
2 Редактор часть проекта разработки инструментария для создания веб приложений
3 Пакет пишется основном ДЛЯ СЕБЯ (чтобы облегчить разработку конкретно мне )
4 Кроме того имеет место самообучение тонкостям веб-программирования
(Готовый пакет мне и близко не позволит добиться нужного уровня понимания )


Зы
 Тессаляция — штука интересная но «не в тему» . Разбивать на полигоны мне ничего пока не нужно . (Ты бы ещё например тру-форминг вспомнил https://ru.wikipedia.org/wiki/TruForm) 8)
Но если уж записал себя в «не проходимые первопроходцы» что посоветуешь «из не пройденного »? Нет кроме, шуток вдруг что-то действительно интересное предложишь ... :idea:
Зы Зы
Часть функционала традиционно закладываемого похожие редакторы у меня просто про пропущена по причине того, что основные задач у проекта совсем ДРУГИЕ чем у «просто редактора» Глянь тему проекта внимательней , там не все так примитивно как может показаться .
Последний раз редактировалось Alex2013 05.11.2019 01:27:06, всего редактировалось 3 раз(а).
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Лекс Айрин » 18.01.2017 09:24:07

olegy123 писал(а):Может OpenGL?


Может... я их постоянно путаю(((

olegy123 писал(а):перестань изобретать то, что уже давно пройдено..


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

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

Сообщение vitaly_l » 18.01.2017 09:47:53

Alex2013 писал(а):Тессаляция — штука интересная но «не в тему» . Разбивать на полигоны мне ничего пока ненужно . (Ты бы ещё например тру-форминг вспомнил https://ru.wikipedia.org/wiki/TruForm)

Человек Вам от чистого сердца - верное решение предложил, но раз Вам такие решения не по душе, то попробуйте поискать ScanLine, т.к. такие масштабные переборы в Bitmap делаются с помощью ScanLine. И он(ScanLine) в Лазарусе работает только при подключении внешних библиотек.

olegy123 писал(а):щас все решается разбиением на простые фигуры.. посмотри что такое тессаляция.

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



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Лекс Айрин » 18.01.2017 09:58:06

vitaly_l писал(а): Даже в построении моделей хорошим тоном считается разбиение на 4-х угольники, т.к.


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

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

Сообщение olegy123 » 18.01.2017 13:10:18

Alex2013 писал(а):1 Такого функционала я обнаружил не у одного «давно проеденного пакета» .

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

Alex2013 писал(а):Тессаляция — штука интересная но «не в тему» . Разбивать на полигоны мне ничего пока ненужно .

Очень в тему: разбивается сложная фигура до примитивов. и потом их переберают "for to do" применяя математический аппарат(нахождения точек в плоскости, принадлежность к линии, и т.п. что уже давно изучено доказано еще в 17х веках великими математиками).. все просто.. Иначе иначе если что то напишите то с кучами ветвлений с кучами циклами .. и все это будет работать относительно к конкретно частному случаю..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение Лекс Айрин » 18.01.2017 13:17:53

olegy123 писал(а):в гуи давно это зашито в высокоуровневыми и максимально оптимизированными функциями..


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

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

Сообщение olegy123 » 18.01.2017 13:28:58

vitaly_l писал(а):Кстати, разбиение на треугольники - давно уже плохой тон.

Треугольники это "три точки на плоскости".. по ним выясняется пересечения плоскости с лучом.. чистая математика.. нахождения плоскости по четырем точкам - этого мы не проходили..

Alex2013 писал(а):Но если уж записал себя в «не проходимые первопроходцы» что посоветуешь «из не пройденного »? Нет кроме, шуток вдруг что-то действительно интересное предложишь ...

Из не пройденного могу посоветовать переписать написанные либлы под новое железо.. AGG(Anti-Grain Geometry) - он же AggPas(пакет входит в поставку lazarus-а) под CUDA или OpenCL. Там ты не только славы поимеешь, но и бабла могут подсыпать от капиталистов-эксплуататоров.. много бабла, потому что это для них тоже тяжкий труд.

Добавлено спустя 14 минут 43 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
Могу сообщить, что нет нормального легкого опенсоурс SVG рендеринга..

Добавлено спустя 9 минут 9 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Лекс Айрин писал(а):корее, в механизм отрисовки окон. где-то в районе функций SetWindowRgn и т.п.

Вся векторная графика представлена.. даже векторные шрифты рисуются.. градиенты с тенями...
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение vitaly_l » 18.01.2017 14:00:15

olegy123 писал(а):Треугольники это "три точки на плоскости".. по ним выясняется пересечения плоскости с лучом.. чистая математика.. нахождения плоскости по четырем точкам - этого мы не проходили..

Излагаю, геометрия 2222 летней давности: вначале находим плоскость по трём точкам (раз уж Вы заговорили о 3D) и потом смотрим: "а пересекает ли луч плоскость в границах треугольника?" <== верно? Если мы плоскость уже нашли, то при прямоугольниках, чтобы найти пересечение во втором, треугольнике, мы уже в каждой итерации - экономим на поиске плоскости. <== Ферштейн? Или не бельмеса?

Но это ещё не полная оптимизация, т.к. если после нахождения плоскости, искать принадлежность сразу в прямоугольнике (а не в двух треугольниках), то это уже ДВОЙНАЯ оптимизация на каждую итерацию и ОЧЕНЬ значительная прибавка в скорости 3D движка. Тоже самое касается и 2D.

:roll: И чему Вас только учили в этих школах и институтах? :wink:

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение olegy123 » 18.01.2017 14:25:12

vitaly_l писал(а):Ферштейн? Или не бельмеса?

Nicht ferstein.. Походу дела вы путаете плоскость с прямоугольником..
Любую фигуру проще выразить через треугольник чем через квадрат. Сам квадрат может показан быть через два треугольника.. а треугольник через квадрат?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение Alex2013 » 18.01.2017 14:30:16

Лекс Айрин писал(а):Человек Вам от чистого сердца - верное решение предложил, но раз Вам такие решения не по душе, то попробуйте поискать ScanLine, т.к. такие масштабные переборы в Bitmap делаются с помощью ScanLine. И он(ScanLine) в Лазарусе работает только при подключении внешних библиотек.


Уже сам догадался ... Кстати работает реально быстрее даже на глаз заметно
(Что в LCL такого в канвас напихали что ПРОСТОЙ ДОСТУП К ПИКСЕЛЮ взывает настолько дикий тормоз ?)
Код: Выделить всё
/ Номер команды по клику
// и определение границ текущей фигуры

Function GetCMDOnClik(X,Y:Longint):Longint;
Type
  AB=Array  [0..1] of byte;
Var
B:TBitmap;
i,YF,Y1,X1:longint;
R:TRect;
PLine:^AB;
BP: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;
       PLine :=b.ScanLine[Y1];
        for X1:=0 to b.Width-1 do
          if PLine^[X1*3+2]<>$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;
      PLine :=b.ScanLine[Y1];
        for X1:=b.Width-1 downto 0 do
          if PLine^[X1*3+2]<>$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;

ИзображениеИзображение
Зы
Насчет "от чистого сердца" извините есть сомнения ... (И "куль-нуль- хакер" или бото-диот опять на форуме похоже завелся со "стандартными дуростьями" типа поменять ссылку на тему на ссылку на картинку ярлыка темы ( возможно сейчас это мой ляп (у меня их вообще "традиционно " много :wink: ) но когда-то ранее было открыто два окна и в том что не обновил было все ок.. так что работа "дур машины" отслежена на 100% )

Зы Зы
Но допустим что я неправ ... в этом случае прошу извинить за брюзжание .. :oops: Но есть реально сильные сомнения в целесообразности слишком уж сложного алгоритма для столь маловажной функции . Вот фокус вроде пропуска линий или и масштабирования реализуемые несколькими строчками кода это другое дело . А писать простыни кода ради того чтобы сказать "я знаю это конгфу" мне и лень и смысла в этом занятии я совершенно не вижу! :idea:
Последний раз редактировалось Alex2013 18.01.2017 15:18:10, всего редактировалось 5 раз(а).
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение vitaly_l » 18.01.2017 14:44:32

olegy123 писал(а):Nicht ferstein.. Походу дела вы путаете плоскость с прямоугольником..
Любую фигуру проще выразить через треугольник чем через квадрат. Сам квадрат может показан быть через два треугольника.. а треугольник через квадрат?

Треугольники (в такой системе) - априори запрещены. Это просто система позволяющая делать - очень-очень, быстрые 3D движки, т.к. 50-75% снижает нагрузку на процессор. Теперь Ферштейн в умной оптимизации? Или всё ещё ни бельмеса, в итерациях?

Alex2013 писал(а):Уже сам догадался ... PLine :=b.ScanLine[Y1];

Ну вот уже что-то похожее на истину. Но всё равно непонятно, почему вы не используете array of TRect?
array of TRect <== будет работать быстрее, тем более что, в WEB - все элементы прямоугольные.

Добавлено спустя 11 минут 11 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Да и ещё, у WEB-фигур есть положение по оси Z.
Иначе, как Вы будете работать с фигурами которые пересекают друг друга?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Alex2013 » 18.01.2017 15:46:42

vitaly_l писал(а):
Alex2013 писал(а):Уже сам догадался ... PLine :=b.ScanLine[Y1];

Ну вот уже что-то похожее на истину. Но всё равно непонятно, почему вы не используете array of TRect?
array of TRect <== будет работать быстрее, тем более что, в WEB - все элементы прямоугольные.

Добавлено спустя 11 минут 11 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Да и ещё, у WEB-фигур есть положение по оси Z.
Иначе, как Вы будете работать с фигурами которые пересекают друг друга?


.


1 WEB - все элементы прямоугольные. ? Кто вам это сказал ? Отнюдь не все !
Даже у меня в редакторе уже есть например полилинии которые в коде-веб страницы задаются начальной точкой ...
И веб-код он у меня как истина "где-то там"( на выходе генерируется) а в редакторе есть свои внутренний представления данных (в виде списка команд например ) ...

2 у WEB-фигур есть положение по оси Z. Да есть, но пока использование этого параметра для чего-то вроде чуть расширенного редактора форм лазаруса (или например хайсама ) есть"явное литературное излишество" возможно когда-нибудь в не очень далеком будущем дойдут руки и до использования и этой возможности но пока все делается как можно проще . (Тем более что редактор позволяет дополнять функционал элементов и добавлять новые "налету" без вмешательства в основной код )

3 "почему вы не используете array of TRect?" честно говоря для меня это новая идея ...
С трудом представляю как ее можно реализовать тем более в моем случае потому что
1 У меня нет фиксированного формата данных
2 Элемент может быть какой угодно формы и без заранее определенного прямоугольника (то есть есть набор неких данных по которым скрипт что-то может нарисовать (в том числе и вообще рандомно перерисовывать с каждой прорисовкой, например снег идущий фоном ) )
То есть нужно определить размер блока в который вписано некое " облако неопределенной формы " именно в момент клика по нему мышкой .
Последний раз редактировалось Alex2013 18.01.2017 16:13:12, всего редактировалось 4 раз(а).
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Лекс Айрин » 18.01.2017 15:54:17

olegy123, совет, не спорьте с ним.

vitaly_l писал(а):Это просто система позволяющая делать - очень-очень, быстрые 3D движки, т.к. 50-75% снижает нагрузку на процессор. Теперь Ферштейн в умной оптимизации?

Интересная оптимизация... сначала находим треугольник, строим плоскость, а потом ее выражаем через квадрат? Я тебе очень странную вещь скажу... не надо так делать. 3D-полигональная модель, чего-то сложнее параллелепипеда, всегда строилась из треугольников, Иногда, используется квадратная сетка в перспективных преобразованиях на плоскости, теоретически, можно сделать кубическую сетку и для пространства . Можно, в принципе, объединять треугольники в одну фигуру, но это уже более поздние и не обязательные оптимизации модели.


vitaly_l писал(а):тем более что, в WEB - все элементы прямоугольные.


Не все. Особенно для веб 2.0.

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

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

Сообщение vitaly_l » 18.01.2017 16:15:17

Лекс Айрин писал(а):vitaly_l писал(а):
тем более что, в WEB - все элементы прямоугольные.
Не все. Особенно для веб 2.0.

Все элементы в WEB - прямоугольные, но на их прямоугольном канвасе, можно нарисовать круг и даже сложную букву "Ша".
:arrow: Пример непрямоугольного элемента DOM - приведите сюда, чтобы все поняли, суть, абсолютного вашего незнания WEB-технологий.

Лекс Айрин писал(а):Интересная оптимизация... сначала находим треугольник, строим плоскость, а потом ее выражаем через квадрат? Я тебе очень странную вещь скажу... не надо так делать. 3D-полигональная модель, чего-то сложнее параллелепипеда, всегда строилась из треугольников, Иногда, используется квадратная сетка в перспективных преобразованиях на плоскости, теоретически, можно сделать кубическую сетку и для пространства . Можно, в принципе, объединять треугольники в одну фигуру, но это уже более поздние и не обязательные оптимизации модели.

Эту туфту, даже обсуждать не буду - времени жаль.

Alex2013 писал(а):И веб-код он у меня как истина "где-то там"( на выходе генерируется) а в редакторе есть свои внутренний представления данных (в виде списка команд например ) ...

Это уже более понятно, но раз Вы пишите для WEB, то быть может array of TRect вам пригодится, т.к. с ним проще.
Вам решать - это Ваша программа.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Лекс Айрин » 18.01.2017 17:09:18

vitaly_l писал(а): Вы хоть один WEB-ресурс видели в своей жизни?


полно... причем, подходы с тех времен, когда активно изучал это дело весьма продуктивно использую и сейчас))

vitaly_l писал(а): Пример непрямоугольного элемента DOM


Легко! Обычный абзац текста. Он же не обязан быть прямоугольным, он даже в ворде так себя ведет. А на веб-странице он вообще по поведению напоминает жидкость и заполняет все, если не применять особые ухищрения. При правильном дизайне (samlib.ru, стоит обратить внимание на список авторов на букву "А"), форма далеко не прямоугольная.


И, если уж на то пошло, DOM и WEB существуют в практически параллельных областях.
vitaly_l писал(а):Эту туфту, даже обсуждать не буду - времени жаль.


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

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 228

Рейтинг@Mail.ru