Рисование пунктирных границ - PullRequest
1 голос
/ 11 сентября 2009

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

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

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

alt text

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

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

Ответы [ 5 ]

2 голосов
/ 11 сентября 2009

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

alt text

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

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

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

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

2 голосов
/ 11 сентября 2009

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

2 голосов
/ 11 сентября 2009

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

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

2 голосов
/ 11 сентября 2009

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

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

0 голосов
/ 11 сентября 2009

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

...