2009-09-10 1 views
1

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

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

Но на картах границы такого рода обычно отображаются штриховыми пунктирными линиями. В этом случае, ситуации, подобные изображенному ниже, может произойти:

alt text

Обратите внимание, как образец пунктира, который обычно является тире-точка-точка, портится, где эти две области имеют общую границу. В этом случае он стал шаблоном longdash-dot, но в целом он мог делать что угодно: от обычного совпадения до создания сплошной линии.

Как сделать/отображать программное обеспечение рендеринга, предотвращающее появление таких артефактов?

ответ

2

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

+0

Это работает, но разделение его на отдельные сегменты означает как очень большое количество сегментов, так и довольно сложную систему для распространения, где вы находитесь в тире, когда вы переходите от одного сегмента к соединительному (что-то, что обрабатывается GDI + включая правильное сглаживание, если я рисую целые пути). –

+0

Хорошо, если вы не хотите потерять позицию в шаблоне, можете ли вы переключиться на прозрачную ручку по уже нарисованным сегментам? Я не думаю, что ваша точка действительна, потому что, если у вас есть две линии, сходящиеся в одну, шаблон может быть непрерывным только для одной линии (той, которую вы нарисовали первым), а не для обоих. – cdonner

+0

Я думаю, что путаница здесь - несогласие с тем, что составляет сегмент. Полилины на самом деле гораздо более зубчатые, чем на образце выше, и имеют множество поворотов и поворотов в местах, отличных от пересечений с другими округами. Если мы разделим его на каждый маленький прямой сегмент, это добавит массу мест, где шаблон будет потерян. Вы правы, что на перекрестке он может быть непрерывным только для одной линии или другой, но это не такая уж большая сделка. –

2

Ваш рисунок кисти окрашивает несколько пикселей в черный цвет и оставляет несколько пикселей в покое. Вместо того, чтобы оставить один пиксель, можете ли вы настроить свой шаблон кисти, чтобы покрасить эти пиксели белого (или как бы то ни было на ваш цвет фона)?

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

+0

Это умное решение, но оно не будет работать на сглаженных рисунках. Вы всегда получаете пиксель-гнус по краям. –

+0

Сглаживание - проблема, да, потому что сплошной белый нежелателен, мне нужны слои внизу, чтобы показать, где нет тире. –

+0

Хотя ... если я сделаю весь рисунок, а затем весь композитинг, вместо того, чтобы компоновать, как я рисую, сплошной белый, затем пунктирный план мог бы работать очень хорошо. Хорошая идея! –

2

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

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

+0

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

+0

Я не пробовал это, но если бы я попытался, я бы приблизился к нему следующим образом: 1) Создайте класс, представляющий один отрезок линии, то есть 4 числа, которые описывают координаты начальной и конечной точек , 2) Создайте метод, который сравнивает два из этих сегментов (добавьте некоторый допуск к сравнению). Убедитесь, что они оцениваются как идентичные, даже когда они путешествуют в противоположных направлениях. 3) При рисовании создайте словарь всех сегментов и протестируйте каждый новый сегмент по словарю. Если это работает, вы можете решить это без каких-либо операций пересечения геометрии. –

+0

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

0

Это интересный вопрос, о котором я никогда не думал. Я считаю, что единственным реальным решением является превращение всей сложной фигуры в ряд строк или путей, которые нигде не пересекаются. Я не удивлен, что GDI + не справляется с этой ситуацией каким-либо автоматическим способом.

+0

Полностью. Я вообще не виню GDI +, я просто пытаюсь понять, как другие справились с этой ситуацией. –

+0

Это * интересная проблема, хотя я бы, вероятно, просто использовал для этого сплошную светло-серая (серая?) Линия. Я признаю, что это абсолютно мошенничество. :) – MusiGenesis

2

Вместо того, чтобы идти с пунктирной линией, вы можете сделать это Zip-A-тон стиль, как это:

alt text

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

Для этого изображения я просто пошел с чередующимся рисунком шахматной доски с линиями шириной два пикселя. Поскольку все линии взяты из одного большого (виртуального) блока этого шаблона шахматной доски, вам никогда не придется беспокоиться о странных артефактах в суставах или о любых эффектах перекрытия.

Угловые линии немного сложны, но в основном вы представляете себе края линии, прорезающие пиксели, и, таким образом, вы рисуете их в соответствующем оттенке класса вместо полного черного (в случае линии 45 градусов здесь пиксели рисуются с помощью RGB (170, 170, 170), но любой угол может отображаться с соответствующими оттенками).

Я не уверен, что GDI + мог легко это сделать, используя текстурированные кисти, но, возможно. В противном случае вам придется настраивать его. Преимущество этого метода над сплошными серовыми линиями состояло бы в том, что это позволило бы некоторым фонам проявиться.

+0

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

+0

@ Doug: да, текстурированные кисти делают это автоматически (я просто попробовал). Я подумал, что, возможно, текстурированная кисть создавала бы поэтапные ошибки, основанные на том, где были нарисованы линии и фигуры, но она рисует все, начиная с одного из выгравированных листов текстурного растрового изображения * a la * zip-a-tone. – MusiGenesis

+0

@Doug: Ваша задача звучит потенциально очень болезненно. Что вы делаете, когда две линии перекрываются только частично? – MusiGenesis