Информация об изменениях

Сообщение Re: рисование линий различной толщины от 27.08.2023 13:31

Изменено 27.08.2023 13:32 vsb

Re: рисование линий различной толщины
Здравствуйте, ssvSerge, Вы писали:

S>Делаем графическое приложение для носимого устройства. Использование сторонних графических библиотек очень нежелательно (сильно ограничены ресурсами).


S>Неожиданной задачей оказалось рисование полилиний толщиной больше одного пиксела. Если рисовать несколько линий рядом, то и толщина меняется и появляются "дыры". Сейчас в каждой позиции рисуем круг нужного диаметра. Это решает все вопросы, но эффективность оставляет желать лучшего.


S>Есть ли более адекватные подходы?


Адекватный подход называется антиалиасинг. Для линий тут всё просто. Представьте себе, что рисуете две параллельные линии нулевой толщины на листе клетчатой бумаги. Клетки это пиксели, расстояние между линиями это целевая толщина конечной линии, линии это границы конечной линии. И потом закрашиваете клетки на листе клетчатой бумаги. Если клетка целиком между этих двух границ поместилась, значит закрашиваете в чёрный цвет. Если половина клетки внутри линии, значит закрашиваете серым цветом. Ну и так далее, чем больше клетки внутри линии, тем черней цвет.

Это пример для белого и чёрного. С любыми другими цветами аналогично. Как правильно рассчитывать переход между цветами — там тоже есть нюансы, ну для начала можно просто по каждой компоненте RGB смасштабировать.

Про алгоритмы: я знаю такой: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%92%D1%83 может и получше есть.

Ещё нюанс — для целочисленных значений толщин линий при рисовании горизонтальных и вертикальных линий я бы советовал округлять координаты так, чтобы размытия не было.
Re: рисование линий различной толщины
Здравствуйте, ssvSerge, Вы писали:

S>Делаем графическое приложение для носимого устройства. Использование сторонних графических библиотек очень нежелательно (сильно ограничены ресурсами).


S>Неожиданной задачей оказалось рисование полилиний толщиной больше одного пиксела. Если рисовать несколько линий рядом, то и толщина меняется и появляются "дыры". Сейчас в каждой позиции рисуем круг нужного диаметра. Это решает все вопросы, но эффективность оставляет желать лучшего.


S>Есть ли более адекватные подходы?


Адекватный подход называется антиалиасинг. Для линий тут всё просто. Представьте себе, что рисуете две параллельные линии нулевой толщины на листе клетчатой бумаги. Клетки это пиксели, расстояние между линиями это целевая толщина конечной линии, линии это границы конечной линии. И потом закрашиваете клетки на листе клетчатой бумаги. Если клетка целиком между этих двух границ поместилась, значит закрашиваете в чёрный цвет. Если половина клетки внутри линии, значит закрашиваете серым цветом. Ну и так далее, чем больше клетки внутри линии, тем черней цвет.

Это пример для белого и чёрного. С любыми другими цветами аналогично. Как правильно рассчитывать переход между цветами — там тоже есть нюансы, ну для начала можно просто по каждой компоненте RGB смасштабировать.

Про алгоритмы: я знаю такой: Википедия: Алгоритм Ву может и получше есть.

Ещё нюанс — для целочисленных значений толщин линий при рисовании горизонтальных и вертикальных линий я бы советовал округлять координаты так, чтобы размытия не было.