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

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

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

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

Сообщение vitaly_l » 24.01.2017 19:46:01

Alex2013 писал(а):Да и не жалуюсь я, просто решил поделится очередным УСПЕШНЫМ ОПЫТОМ до которого додумался в результате "мозгового штурма " в том числе обдумывая и твои советы ... Кроме шуток, спасибо !

Попробуйте посчитать, время исполнения вашего кода при следующих условиях:
1) Дано 1000 элементов в списке.
2) Тот на который вы кликаете находится в списке под 1000 номером (самый последний).
3) чтобы перебрать все элементы, нужно 1000 раз нарисовать маску и 1000 раз её просчитать.
ВОПРОС: Через сколько минут или секунд, машина закончит обсчёт 1000 масок и сработает вот этот Ваш код? :
Код: Выделить всё
           CurRec:=R;
           fCurRec:=True;
           Result:=I;// Номер в списке
           break;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 24.01.2017 20:01:25

>>Опять-же написано вроде ....
Просто надо разбираться в чем проблема, а не тупо менять 0 на ф2 и байт на ворд, списывая всё на непонятные глюки. Небывает непонятных глюков, бывают кривые руки и баги. второе очень реже чем первое.
Заявляешь что чтото неработает - будь добр минимальный пример нерабочести.

Добавлено спустя 43 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
Даже художники с тобой несогласны. пора делать выводы.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 24.01.2017 20:16:42

vitaly_l писал(а):
Alex2013 писал(а):Да и не жалуюсь я, просто решил поделится очередным УСПЕШНЫМ ОПЫТОМ до которого додумался в результате "мозгового штурма " в том числе обдумывая и твои советы ... Кроме шуток, спасибо !

Попробуйте посчитать, время исполнения вашего кода при следующих условиях:
1) Дано 1000 элементов в списке.
2) Тот на который вы кликаете находится в списке под 1000 номером (самый последний).
3) чтобы перебрать все элементы, нужно 1000 раз нарисовать маску и 1000 раз её просчитать.
ВОПРОС: Через сколько минут или секунд, машина закончит обсчёт 1000 масок и сработает вот этот Ваш код? :
Код: Выделить всё
           CurRec:=R;
           fCurRec:=True;
           Result:=I;// Номер в списке
           break;


С сотнями элементов все было успешно ( то есть задержки практически не ощущается )
Проблемы определением текущего элемента практически НЕТ
Откуда она будет, если просчет масок походит точно так же, как и штатная перерисовка списка фигур ? ( добавляется только очистка битмапа но зато "убавляется" вывод на экран )

НО были заметные ТОРМОЗА при определении границ больших фигур ...
Теперь и с этим проще (отличия в определении квадрата 10х10 и например 2000х1000 мало существенны (на глаз менее 100мс) ) хотя до "совершенства" еще довольно далеко но уже на уровне собственно скорости прорисовки .

Но числовые значения померить интересно .... :idea:
Зы
1000 номером (самый последний).

У меня самым дальним будет элемент под номером "0"
Последний раз редактировалось Alex2013 24.01.2017 20:28:56, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3155
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение vitaly_l » 24.01.2017 20:27:38

zub писал(а):Даже художники с тобой несогласны.

Между прочим, художники давным-давно уже приличные программисты. Художники, только когда с чужими модулями сталкиваются, впадают в депрессию, потому что, нужно много знать, а художники поклоняются великому и мудрому, путешественнику Незнайке. Так что, зря в этом ключе давите, надо будет я и у Вас zub, в коде "ошибку" найду. Точнее у него не ошибка, а непродуманная структура. Но если она даст нормальные показатели по времени, то пофигу.

А по поводу сбоев с цветом, непонятно зачем вот это: CurCanvas.Pen.Mode:=pmCopy; ?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Alex2013 » 24.01.2017 20:49:13

vitaly_l писал(а):
zub писал(а):Даже художники с тобой несогласны.


А по поводу сбоев с цветом, непонятно зачем вот это: CurCanvas.Pen.Mode:=pmCopy; ?

Гм ... строка возможно действительно лишняя ... Нужно проверить!
... привычки вредные видимо работают "поставил верни"... :roll:
"Багофичи", ошибки и изначальное несовершенство моего кода совершенно очевидны... причем даже мне самому ! :mrgreen:
... к сожалению "вылизывать" код сразу при его написании мне не всегда по силам . :oops:
Но знаете, то что я доводил до стадии Релиза работает как минимум надежно.
А "красота внутреннего мира программного кода " да желательна НО не критична !

(.. и вы не видели код, что на полном серьезе плодили преподаватели моей альмаматер и сотрудники разных далеких от создания ПО НИИ ... Все познается в сравнении! :idea: )
Зы
Но пишу я на форум в надежде на КОНКРЕТНЫЙ ОТВЕТ НА КОНКРЕТНЫЙ ВОПРОС (или на обсуждение помогающее его решить )! :idea: И я не думаю, что форум где "колхоз дело добровольное " можно использовать вместо кнопки "Сделать хорошо" . 8)
Alex2013
долгожитель
 
Сообщения: 3155
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Лекс Айрин » 24.01.2017 21:11:26

Alex2013 писал(а):Но пишу я на форум в надежде на КОНКРЕТНЫЙ ОТВЕТ НА КОНКРЕТНЫЙ ВОПРОС


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

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

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

Сообщение zub » 25.01.2017 03:26:35

>>хотя до "совершенства" еще довольно далеко но уже на уровне собственно скорости прорисовки .
А ниче что отрисовка самая медленная процедура, которую нужно избегать до последнего?

>>Но пишу я на форум в надежде на КОНКРЕТНЫЙ ОТВЕТ НА КОНКРЕТНЫЙ ВОПРОС
>>Как оптимизировать определение границ произвольной фигуры ?

Конкретный ответ: Смотреть что рисуется и вылавливать min-max координаты. Не опускаясь до "растрового" уровня.
Даже если рисуется растровое изображение - принимать его габарит, а не пытаться по нему поползать в надежде "обрезать" "прозрачные" области, которых в 99% случаев не будет.

Будут конкретные "почему нет"? "какбы неизвесно что рисуется" и "это же надо много переделать" - не принимаются.

Добавлено спустя 5 часов 47 минут 40 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
vitaly_l
>>надо будет я и у Вас zub, в коде "ошибку" найду. Точнее у него не ошибка, а непродуманная структура. Но если она даст нормальные показатели по времени, то пофигу.
Надо. буду только рад. Она неможет дать нормальные результаты, математические (безрастровые) результаты всегда будут в разы лучше
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 25.01.2017 13:43:09

Лекс Айрин писал(а):
Alex2013 писал(а):Но пишу я на форум в надежде на КОНКРЕТНЫЙ ОТВЕТ НА КОНКРЕТНЫЙ ВОПРОС


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

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


Я и не думал впадать в панику ...
С чего бы это ? Я плотную подошел к этапу когда в заголовке темы можно будет "с победным видом" :wink: дописать "РЕШЕНО" Но я столкнулся с тем что функция CompareByte не работает массивом данных длиннее примерно 225 байт .
(что согласись странно !) я даже догадываюсь в чем дело ( в модуле sysyem применяется древний "наследуемый код" который с проблемами исполнятся в современных осях и на более мене современных процессорах... точно такие же проблемы есть например при использовании старого метода доступа к файлам ) Я заменил CompareByte на CompareWold и все заработало как надо но проблема никуда не делась ...

Вот я поделившись "локальными успехами", задал простой вопрос :
Вопрос: почему вариант с CompareByte не работает после левого края фигуры (R.Left) больше 225 (даже меньше 255! )?

:roll: :idea:
Зы
Что до предложения "сделать хорошо" другими средствами то я честно попробовал, оценил трудоемкость... и со вздохом вернулся к текущему компромиссному решению ... ("По хорошему" ведь нужно вводить ViewPort отделяя рисуемую фигуру от начальной точки пересчитывать координаты в локальные и обратно (для масштабирования ) и тд и т.п. + Возможно придется менять ВСЕ скрипты (да они простые но их уже довольно много ) )
Последний раз редактировалось Alex2013 25.01.2017 14:04:53, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3155
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 25.01.2017 14:01:13

Пример с проблемой CompareByte будет?
В моем всё ок
Код: Выделить всё
program Project1;
const
  TestSize=100500;
type
  TTestType=byte{word};
  TTestArray=Array [0..TestSize] of TTestType;
var
  a,b:TTestArray;
  i:integer;
begin
  for i:=0 to TestSize do
    a[i]:=random(high(TTestType));
  b:=a;
  writeln(CompareByte(a,b,TestSize+1));
  b[TestSize]:=b[TestSize]-1;
  writeln(CompareByte(a,b,TestSize+1));
  {writeln(CompareWord(a,b,TestSize+1));
  b[TestSize]:=b[TestSize]-1;
  writeln(CompareWord(a,b,TestSize+1));}
  readln;
end.


Добавлено спустя 1 минуту 2 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
случай для ворд закоментирован. меняй коменты местами. Но и там и там всё работает нормально
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Лекс Айрин » 25.01.2017 14:03:35

Alex2013 писал(а):Что до предложения "сделать хорошо" другими средствами то я честно попробовал, оценил трудоемкость... и со вздохом вернулся к текущему компромиссному решению ...


Все равно ведь придется. Не сейчас, так когда будешь делать один из следующих релизов. И, поверь, лучше это делать до того как станет совсем поздно. И никто не помешает тебе форкнуть проект и писать по старому, одновременно оптимизируя код в новом.

Alex2013 писал(а):Вот я поделившись "локальными успехами", задал простой вопрос :

Вопрос: почему вариант с CompareByte не работает после левого края фигуры (R.Left) больше 225 (даже меньше 255! )?


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

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

Сообщение Alex2013 » 25.01.2017 15:04:52

zub писал(а):Пример с проблемой CompareByte будет?
В моем всё ок
Код: Выделить всё
program Project1;
const
  TestSize=100500;
type
  TTestType=byte{word};
  TTestArray=Array [0..TestSize] of TTestType;
var
  a,b:TTestArray;
  i:integer;
begin
  for i:=0 to TestSize do
    a[i]:=random(high(TTestType));
  b:=a;
  writeln(CompareByte(a,b,TestSize+1));
  b[TestSize]:=b[TestSize]-1;
  writeln(CompareByte(a,b,TestSize+1));
  {writeln(CompareWord(a,b,TestSize+1));
  b[TestSize]:=b[TestSize]-1;
  writeln(CompareWord(a,b,TestSize+1));}
  readln;
end.


Добавлено спустя 1 минуту 2 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
случай для ворд закоментирован. меняй коменты местами. Но и там и там всё работает нормально

Ну что я могу сказать глюк в наличии перезагрузкой не "лечится "... :idea:
Надо будет видеоолик снять с экрана
+ проверить на других железках ...
+ пример подготовить (с моей функций) ...(Это просто !)
Alex2013
долгожитель
 
Сообщения: 3155
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 25.01.2017 15:09:45

видеороликов точно ненадо. Думаю глюк в другом месте, а не в comparebyte
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 25.01.2017 15:42:51

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


Все равно ведь придется. Не сейчас, так когда будешь делать один из следующих релизов. И, поверь, лучше это делать до того как станет совсем поздно. И никто не помешает тебе форкнуть проект и писать по старому, одновременно оптимизируя код в новом.

Сейчас начинаю писать еще одну утилиты для проекта "Web2" ( рабочие название "комбинатор" )
Вот там попробую сразу писать с учетом опыта и советов .
А текущею разработку "редактор форм и страниц" мне важно наполнить функционалом ...
то есть что-бы все что планировал работало + дописать достаточно представительный набор инструментов-элементов .
Рефакторинг планирую но после выхода на уровень Беты .
Alex2013 писал(а):Вот я поделившись "локальными успехами", задал простой вопрос :

Вопрос: почему вариант с CompareByte не работает после левого края фигуры (R.Left) больше 225 (даже меньше 255! )?


Это даже, по современным меркам, не вопрос. Ответ прост -- магические (ничем не объяснимые, но введенные программистом) ограничения. Мало ли их уже было.

Магии в программировании нет но есть "шмагия" (ага "синдром ложной манны" :wink: ) но ней можно успешно бороться .
Ошибки и глюки в сложных системах неизбежны . Программистам остается только одно : постараться в локальной программе исключить их влияние на функционал своей программы .
На пример: если не работает стандартный способ вызова системной функции вызвать её самостоятельно("сражение" библиотек "потоки против файлов" отличный пример! ) или вообще заменить на свой код. Но тут другой случай : исходник функции доступен можно подумать, что там не так ...
Возможно это глюки конкретной железки (сбой памяти или микрокода ЦПУ например ) нужно проверить !
Alex2013
долгожитель
 
Сообщения: 3155
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Лекс Айрин » 25.01.2017 15:51:39

Alex2013 писал(а):Ошибки и глюки в сложных системах неизбежны .


Тогда работа программиста лишена смысла. И все сразу становится печально и безрадостно.

Alex2013 писал(а):Рефакторинг планирую но после выхода на уровень Беты .


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

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

Сообщение Alex2013 » 25.01.2017 15:59:48

zub писал(а):видеороликов точно ненадо. Думаю глюк в другом месте, а не в comparebyte

Понимаешь я точно отследили не срабатывание именно comparebyte (Тупо поставил ShowMessage и посмотрел , что выдает comparebyte на каждое значение Y1 ) .
Что там еще может быть если тот-же самый код но с CompareWord работает нормально ? :roll:
Сбой в ScanLine ? но CompareWord работает !
Есть идеи что у меня на ноте не все в порядке с совместной работой двух ядер цпу для программ не имеющих заточки на многоядерность ... (То есть ОС(или сам ЦПУ) самостоятельно пытается раскидать "обычный последовательный код " на несколько параллельных потоков ... и вот тут то и возникают "странные сбои" )
Alex2013
долгожитель
 
Сообщения: 3155
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru