Цвет пикселя чего?спс, понятно.
еще вопрос: как узнать цвет пикселя в окне своей программы на WinAPI или MFC?
рабочей области окна. просто я рисую в нем с помощью мышки линии и надо узнать в каких местах одна перекрывает другую.Цвет пикселя чего?
рабочей области окна. просто я рисую в нем с помощью мышки линии и надо узнать в каких местах одна перекрывает другую.
Например, GetPixel методом.рабочей области окна. просто я рисую в нем с помощью мышки линии и надо узнать в каких местах одна перекрывает другую.
Например, GetPixel методом.
Еще можно создать DIB секцию, и копировать на него с контекста окна BitBlt-ом. Но это "грязные" подходы, т.к. в разные моменты времени на окне может быть не совсем то, что там рисовалось, да и цвет пикселя может не совпасть с цветом ожидаемой линии хотя бы из-за несовпадения разрядности устройств.
Потому лучше "запоминать", что рисуется на окне в DIB секции.
А вообще, растровый анализ при рисовании векторных данных - не лучшая идея. Гораздо проще запоминать координаты нарисованных линий, чтобы находить их пересечения рассчетами, а не по цвету пикселя.
объясните нубу что есть DIB секции?Вот когда векторных данных будет - туева хуча, находить их "пересечения рассчетами" станет слишком накладно для движения мышкой :huh: DIB секции - реальный выход. Хотя и памяти жрёт немеренно, особенно если надо различать разные типы нарисованного на экране, и для разных типов - по разному реагировать
Две пересекающиеся растровые линии могут и "не пересечься". А когда линий много и они разных цветов, то будет очень сложно определить, пересеклись ли они, и вообще, где тут линии B)Вот когда векторных данных будет - туева хуча, находить их "пересечения рассчетами" станет слишком накладно для движения мышкой :huh: DIB секции - реальный выход. Хотя и памяти жрёт немеренно, особенно если надо различать разные типы нарисованного на экране, и для разных типов - по разному реагировать
в моем случае есть только черный и белыйДве пересекающиеся растровые линии могут и "не пересечься". А когда линий много и они разных цветов, то будет очень сложно определить, пересеклись ли они, и вообще, где тут линии :huh:
Да, а когда будет хуча, можно будет прикрутить какое-нибудь индексирование отрезков на плоскости, чтобы не проверять пересечения со всеми.
даже для двух цветов определить факт пересечения линий в растре нетривиально.в моем случае есть только черный и белый
объясните нубу что есть DIB секции?
Две пересекающиеся растровые линии могут и "не пересечься". А когда линий много и они разных цветов, то будет очень сложно определить, пересеклись ли они, и вообще, где тут линии
Да, а когда будет хуча, можно будет прикрутить какое-нибудь индексирование отрезков на плоскости, чтобы не проверять пересечения со всеми.
даже для двух цветов определить факт пересечения линий в растре нетривиально.
Возьмем две диагональные линии. Они могут пересекаться не имея общих пикселов. Определить точку пересечения, имея координаты, гораздо проще.
Прикрутить индексирование к GDI? такой цели нет. Можно просто хранить координаты. Но если нужно - можно вставить абстракцию между GDI и кодом, который на него отправляет линии.Не пересекутся - забота пользователя, пусть меняет масштаб и перерисовывает изображение. А как эффективно прикрутить индексирование к функциям GDI, которые формируют изображение на экране - я лично не знаю. Такой подход просто бесполезен для изображений, где все линии имеют более менее одинаковые габариты.
Вдруг надо определить координату пересечения с точностью до пиксела? Или долей пиксела?Правильно. Для этого в DIB секции рисуют достаточно "толстые" линии. А если нужно ловить именно точки пересечения, то можно организовать для них отдельную DIB секцию :huh:
Вдруг надо определить координату пересечения с точностью до пиксела? Или долей пиксела?
Да, можно организовать ОЧЕНЬ широкую отдельную DIB секцию, но ходить по ней может быть заметно дороже, чем по массиву координат линий.
массив координат линий есть, но думаю что выделить прямоугольник из DIB с координатами от начала до конца вектора и искать в нем пересечения проще....................
Да, можно организовать ОЧЕНЬ широкую отдельную DIB секцию, но ходить по ней может быть заметно дороже, чем по массиву координат линий.
Прикрутить индексирование к GDI? такой цели нет. Можно просто хранить координаты. Но если нужно - можно вставить абстракцию между GDI и кодом, который на него отправляет линии.
Как считаете, сколько миллионов пересечений линий можно проверить за десятую долю секунды?Так всё-таки пиксель или реальная точка пересечения в реальных координатах? Тогда это другая задача. И думаетцо, серьёзные приложения типа AutoCAD или Illustrator со Smart Guides комбинируют эти подходы. Или занимаются предварительным счётом в фоновом режиме :huh:
Конечно, если все линии напихать в один bounding-box, то толку от индекса будет немного. Но он не предназначен для работы в крайних случаях.bounding-box - это и есть габариты в моём понимании, звиняюсь, что не решился употребить этот английский вариант
Просто хочу сказать, что я занимался ГИС-системами, как промышленными, так и с уровнем предприятия. Для того, чтобы ощутить заметные тормоза от мышки при попытке вычислить пересечения с примитивами, нужно их иметь такое немыслимое кол-во на экране, что в глазах будет рябить. А мелкие невидимые глазу линии, да и более крупные, но находящиеся далеко от окна просмотра, легко отбрасываются индексом.Просто чо хочу сказать B) Ходить по координатам и вычислять при движении мышки - тупиковый подход.
скажет, если абстракция будет владеть алгоритмами растровой развертки.А "абстракция" Вам скажет, где и как прошла линия? Где и как она растеризировалась? В каком пикселе она есть, а в каком её нет?
Как считаете, сколько миллионов пересечений линий можно проверить за десятую долю секунды?
Конечно, если все линии напихать в один bounding-box, то толку от индекса будет немного. Но он не предназначен для работы в крайних случаях.
Просто хочу сказать, что я занимался ГИС-системами, как промышленными, так и с уровнем предприятия. Для того, чтобы ощутить заметные тормоза от мышки при попытке вычислить пересечения с примитивами, нужно их иметь такое немыслимое кол-во на экране, что в глазах будет рябить. А мелкие невидимые глазу линии, да и более крупные, но находящиеся далеко от окна просмотра, легко отбрасываются индексом.
скажет, если абстракция будет владеть алгоритмами растровой развертки.
Причем, она даже сможет сказать какие именно линии проходят через конкретный пиксел.
Полагаю, что Вы хотели сказать "не очень много".Очень много, особенно если линии - эллипсы. Уравнения четвёртого порядка - это не баран чихнул B)
безотносительно условий задачи затрудняюсь ответить.А знаете как часто это бывает?
Начальство наступило этой песне на горло.Везёт Вам - ГИС-системы - песня
Там где нет антиалиасинга все довольно просто. Эмулируется и подгоняется за пару вечеров с высокой вероятностью совпадения результата. Но с нововведениями и уходом от GDI становится сложнее. Впрочем и анализировать растр с целью найти пересечения линий с антиалиасингом - тоже не быстро.А Вы владеете алгоритмами? Знаете, как Microsoft сегодня решил реализовать развертку?
не понял, почему придется много считать для любого пикселя? Можно хранить списки линий для каждого пикселя... Можно хранить не списки, а идентификаторы списков, чтобы можно было расшаривать списки линий для разных пикселей. Своя абстракция может работать с любой структурой данных (хоть с ленивой разреженной матрицей), а не только DIB секций."Причем, она даже сможет сказать...", но считать придётся много, для любого пикселя. Придётся заново пересчитывать. Либо опять же пользоваться GetPixel - со всеми вытекающими :huh:
Полагаю, что Вы хотели сказать "не очень много".
безотносительно условий задачи затрудняюсь ответить.
Начальство наступило этой песне на горло.
Там где нет антиалиасинга все довольно просто. Эмулируется и подгоняется за пару вечеров с высокой вероятностью совпадения результата. Но с нововведениями и уходом от GDI становится сложнее. Впрочем и анализировать растр с целью найти пересечения линий с антиалиасингом - тоже не быстро. :huh:
не понял, почему придется много считать для любого пикселя? Можно хранить списки линий для каждого пикселя... Можно хранить не списки, а идентификаторы списков, чтобы можно было расшаривать списки линий для разных пикселей. Своя абстракция может работать с любой структурой данных (хоть с ленивой разреженной матрицей), а не только DIB секций.