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

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

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

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

Сообщение Alex2013 » 09.02.2017 22:09:00

vitaly_l писал(а):
Alex2013 писал(а):до сих пор мысленно прибываю в состоянии "рука лицо"

Векторная графика, конкретно для решения этой задачи ненужна. ТРектами - сократили количество фигур, а дальше по старинке, раз уж, метафайл не позволяет узнать принадлежность точки рисунку. Геометричекси это вычислить нереально сложно, разве что - разбить на треугольники, как подсказывали выше. И ещё, нужен порядок по оси Z, вначале тестируются ближние и только если false, то следующие. Описываю, подробно на случай если ВДРУГ заглянут крутые математико-геометры, только они могут это вычислить цифрами.


Типа "уже" ... как на знаменитом плокате "когда человек полетит в космос " :D
Извиняюсь после произошедших почти подряд нескольких вчерашних "блэк аутов" по всему району .. опасаюсь не отправляя писать что-то больше пары строк ... вдруг снова ГлюкНет ... Тоже мне мегаполис, столица ... Одно слово "Руина !" :idea:
Последний раз редактировалось Alex2013 06.07.2017 02:10:46, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 09.02.2017 22:26:07

>>Векторная графика, конкретно для решения этой задачи ненужна.
Растровая графика, конкретно для решения этой задачи ненужна.
Всё что нужно тс это:
1 - уметь быстро определять что фигура не попадает в заданый trect по trect фигуры
2 - уметь точно определять что фигура попадает в заданый trect по содержимому фигуры

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

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

Сообщение vitaly_l » 09.02.2017 22:37:42

zub писал(а):Растровая графика, конкретно для решения этой задачи ненужна.

zub писал(а):я незнаю можно ли такое делать с метафайлом, скорее всего понадобится самодельный аналог метафайла.

А поподробнее, можно? Предположим там нарисована шестерёнка с одним очень-очень вытянутым, как у бабы-яги зубом.
И как будем вычислять принадлежность точки к зубу?

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

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

Сообщение zub » 09.02.2017 22:56:11

Забываем про точки, нету точек, есть области заданные координатами углов.

>>И как будем вычислять принадлежность точки к зубу?
А как мы ее нарисовали? если примитивами - общитываем эти примитивы.
Если растр - то выделение растра за границы этого растра, без лазенья внутрь его
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 09.02.2017 23:07:49

zub писал(а):А как мы ее нарисовали? если примитивами - общитываем эти примитивы.

Стоп, стоп, стоп... Одно дело нарисовать, шестерёнку с длинным зубом, и совсем другое узнать, принадлежит ли ей точка.
Предположим шестерёнка, в векторе состоит из 222 фигур. Из них 111 зубья, остальное, различные круглые и квадратные вырезы, для облегчения детали. И как будем высчитывать принадлежность точки, самому длинному зубу? И что будет быстрее просчитать 222 фигуры или всё же растром дешевле?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 09.02.2017 23:22:14

>>Предположим шестерёнка, в векторе состоит из 222 фигур.
>>И что будет быстрее просчитать 222 фигуры или всё же растром дешевле?
Конечно быстрее просчитать. чтоб лезть в растр тебе нужно этот растр нарисовать - это самая медленная операция.
Кроеме того по уму примитивы стоит хранить не в линейном списке, а в пространственно разделенном - поиск будет меньше зависеть от длины списка (ты про это только тсу не говори...)
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 09.02.2017 23:30:48

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

Нет, нет, нет - так не пойдёт! Я совсем ничего не уловил, а хочется уловить. Ещё чуть поподробнее можно? Какие примитивы? Они у него в метафайлах - это векторные рисунки в которых запомнен каждый чих художника, в векторном виде. Этот метафайл, состояние точки не возвращает (согласно словам ТС). Предположим в этом метафайле 333 мазка художника. Как Вы собираетесь посчитать принадлежность их точке? Там нет никаких ректов и все фигуры разные от линий, разной толщины, до многоугольников, часть из которых прозрачные. Может всё таки признаете что растром проще и дешевле или опишите поподробнее?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Pavia » 09.02.2017 23:39:33

Не понимаю в чём сложности использовать TBitmap?
Изображение
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение zub » 09.02.2017 23:51:48

>>Предположим в этом метафайле 333 мазка художника
Предположим у нас картинка из 333 линий. "метафайл" - список из 333 координат линий. посчитать попадает ли линия в область выделения гораздо дешевле чем рисовать эту линию.

С метафайлами о которых говорит тс я не работал, сказать что с ними можно сделать, что нельзя я немогу. ТС использует их от лени - пишет в них вместо вывода на канвас, потом на канвас выводит их содержимое. Так получается обойти "неторопливость" скриптового языка который он использует.
Последний раз редактировалось zub 10.02.2017 00:07:43, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 09.02.2017 23:58:49

zub писал(а):Предположим у нас картинка из 333 линий. "метафайл" - список из 333 координат линий. посчитать попадает ли линия в область выделения гораздо дешевле рисовать эту линию.

Да????? Неужели? Предположим я, нарисовал одной линией шестерёнку с одним очень-очень длинным зубом. И как мне проверить принадлежность точки этой длинной и непрямой линии? При этом ещё ведь нужно учитывать масштаб, ведь метафайл, на экране растягивается... Как вы собираетесь вычислять принадлежность точке? Признаёте или попытаетесь найти принадлежность точки на таком сложном рисунке?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 10.02.2017 00:03:45

что признаю?))
математика быстрее растра. с этим ниче не поделаешь.
Описка, поправил
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Pavia » 10.02.2017 00:15:05

vitaly_l писал(а): Как Вы собираетесь посчитать принадлежность их точке? Там нет никаких ректов и все фигуры разные от линий, разной толщины, до многоугольников, часть из которых прозрачные. Может всё таки признаете что растром проще и дешевле или опишите поподробнее?

Переводим в патч код я уже казал разве что пару строк дописать. Затем нормируем патч. Получаем набор многоугольников. Там-же одной строчкой.
Далее проверка попадания точки в многоугольник.
Пускаем луч от точки по оси X и считаем сколько линий(сегментов) он пересёк.

Это по сложнее чем с TBitmap, но ненамного, Строчек на 50, Но вот если в WMF(EMF) лежат полупрозрачные объекты тогда будут сложности.

Быстрее LazyBitmap, Золотое правило программирования проигрываешь в памяти выигрываешь в скорости. Проигрываешь в скорости выигрываешь в памяти.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Alex2013 » 10.02.2017 00:19:56

Не понимаю в чём сложности использовать TBitmap?

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

То есть чисто теоретически использование МФ в качестве вспомогательного кеша для моей задачи предпочтительно ... Как на практике будет проходить соревнование TMetaFile VS TBitmap сказать сложно .
Слишком все зависит от конкретной реализации .
Последний раз редактировалось Alex2013 05.11.2019 03:00:03, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3143
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение vitaly_l » 10.02.2017 00:36:39

zub писал(а):математика быстрее растра. с этим ниче не поделаешь.

Смотря какая математика. Есть такая математика, которая уступит растру в разы. И вполне возможно, именно такую вы и предлагаете, т.к. вычислений потребуется сделать ОЧЕНЬ-ОЧЕНЬ много + предварительное масштабирование. По сути, нужно заново создать ТМетафайл, добавив в него, возможность вычисления точки для каждой возможной фигуры и линии, с учётом БУДУЩЕГО масштабирования как на канвас. Потом это всё вогнать в примитивы. И только потом можно будет пробежавшись по всем мазкам, найти в 333-м точку пересечения. Что по сути, будет примерно тоже самое по времени, что и для растра, т.к. один растр, заполняется достаточно быстро.

Pavia писал(а):Это по сложнее чем с TBitmap, но ненамного, Строчек на 50

Думаю, побольше, т.к. там будут ещё "подводные костыли".

Alex2013 писал(а):но метафалы реально экономят память

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

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

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

Сообщение zub » 10.02.2017 00:41:16

>>Что по сути, будет примерно тоже самое по времени, что и для растра, т.к. один растр, заполняется достаточно быстро.
По какой сути? ты делал замеры или фантазируешь?
Патчи и метафайлы - очень хорошо. но windows only
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru