Зачем Region.IsEmpty () нужен графический контекст?

Я использую Region.IsEmpty(), чтобы увидеть, пересекаются ли две области, но я действительно не понимаю, почему я должен предоставлять Graphics контекст.

официальное описание говорит

Текущее преобразование графического контекста g используется для вычисления внутренней части области на поверхности рисования.

Какое преобразование в двух измерениях могло бы разделить две перекрывающиеся области или сделать непустую область пустой?

Это вопрос детализации? Сглаживания или сглаживания?


person Zano    schedule 24.06.2013    source источник


Ответы (3)


Регионы - это функция GDI, которая сильно коррелирует с контекстами устройства GDI. Вы можете указать область с числами с плавающей запятой, например конструктор, который принимает GraphicsPath или RectangleF. Но окончательные вычисления производятся с целочисленной точностью. Достаточно хорошо для точности пикселей, больше не требуется.

Преобразование логических координат в координаты устройства (то есть в пиксели) определяется настройкой контекста устройства. Который может иметь режим отображения, отличный от 1: 1. Таким образом, область, представляющая собой прямоугольник, скажем, 2,0 x 2,0, может оказаться пустой после сопоставления с пикселями. Ознакомьтесь с SetMapMode () например.

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

person Hans Passant    schedule 24.06.2013

Метод Region.IsEmpty(Graphics g) проверяет, есть ли в текущем графическом контексте, указанном как g, какие-либо элементы, занимающие определенную область.

Это не обязательно проверка того, пересекаются ли две области, а скорее, пересекает ли область какие-либо другие элементы на поверхности рисования. Экземпляр Graphics позволяет Region выполнять проверку поверхности чертежа, так как это определено как Graphics. В некотором смысле этот метод действительно похож на [не рабочий код] g.ContainsElementsWhichIntersect(theRegion).

person Reed Copsey    schedule 24.06.2013
comment
Итак, Region в каком-то смысле является служебным классом для Graphics? Я выполнил рекомендацию stackoverflow.com/questions/3615326/ (и где-то еще), но, похоже, это не лучший вариант. - person Zano; 25.06.2013
comment
@Zano В основном вам нужно нарисовать один регион в графике, а затем проверить второй. Это дало бы вам возможность выполнить операцию пересечения. - person Reed Copsey; 25.06.2013
comment
За возможным исключением графических контекстов метафайла, не существует концепции графического контекста, имеющего элементы или содержащего элементы. Вещи, которые вы рисуете, растрируются в растровое изображение или HDC. Нет записи, которую вы можете проверить, чтобы увидеть, была ли нарисована конкретная область для создания текущих битов или что рисование было выполнено с помощью System.Drawing, а не GDI или манипуляции с памятью. Имея это в виду, ваш ответ не имеет смысла. - person Esme Povirk; 25.06.2013

По вашей ссылке:

Проверяет, есть ли у этой области пустая внутренняя часть на указанной поверхности рисования.

Оперативный термин в этом утверждении - поверхность рисования. Чтобы иметь поверхность для рисования, вам нужен графический контекст и, следовательно, экземпляр объекта Graphics.

То, что в документации упоминается преобразование, вероятно, немного сбивает с толку жаргон. Это просто причудливый способ сказать, что возвращаемое значение будет истинным в текущем состоянии графического контекста. Если что-то изменится, например, ScaleTransform или даже ванильный вызов DrawLine, значит, произошло «преобразование», и тогда ваш результат IsEmpty может больше не быть действительным.

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

person Paul Sasik    schedule 24.06.2013