Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика

Если абстрактно представить любой алгоритм заливки фигур (не специализированный для какой-то конкретной фигуры, а универсальный) то в нем обязательно обнаружится шаг с проверкой удовлетворяет ли выбранная точка некоторым условиям заливки. Чаще всего эти условия простые. Например, является ли цвет выбранной точки таким же, как и цвет точки, с которой началась заливка. Или еще проще — является ли выбранная точка отличной от цвета заливки. В этой статье предлагается сделать заливку более функциональной и «гибкой», изменив тривиальные условия заливки точки на более сложные. Мы не предлагаем более компактный или быстрый метод заливки, напротив, продемонстрированный ниже пример будет более ресурсозатратным по сравнению с обычными, однако будет предлагать более расширенный функционал, что хорошо подойдет, например, для редакторов изображений.

В качестве примера «нетривиальной проверки заливки» рассмотрим заливку с «жесткостью». Жесткость заливки — это параметр, который указывает на то, насколько значительные отклонения цвета в выбранной точке от цвета в начальной точке можно проигнорировать. Идея очень проста — поочередно считаем абсолютную разницу соответственных компонентов выбранного и начального цвета, выбираем из них наибольшую. Если наибольшая разность меньше параметра «жесткости», то закрашиваем точку.

Функция проверки жесткости на языке Java:

boolean ColorCompatibleByHardness(int pickedColor, int tagetColor, int fillColor, float maxHardness) {
        // pickedColor – выбранный цвет
        // tagetColor – начальный цвет
        // fillColor – цвет заливки
        // maxHardness – жесткость заливки от 0 до 1
 
        //проверяем, не пытаемся ли мы закрасить точку с цветом заливки
        if(pickedColor == fillColor) { 
            return false;
        }
        //получаем компоненты выбранного цвета и начального цвета в виде массивов
        float[] ac = new Color(pickedColor).getRGBComponents(new float[4]);
        float[] bc = new Color(tagetColor).getRGBComponents(new float[4]);
        float maxDiff = 0; //значение разности
        //перебираем первые 3 компонента цветов – R, G и B, компонент прозрачности A нас не интересует
        for(int i = 0; i < 3; i++) {
            //если их абсолютная разница больше текущего значения разности, перезаписываем его
            maxDiff = Math.max(Math.abs(ac[i] - bc[i]), maxDiff);
        }
        //возвращаем истину, если значение разности меньше либо равно максимально допустимому (параметру жесткости заливки)
        return maxDiff <= maxHardness; 
}

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

Примеры заливки изображений с использованием обычной заливки и заливки с жесткостью:

Рис. 1 Специально сконструированный полигон для тестирования заливки из окружностей от более тусклых цветов (приближенных к белому) до более насыщенных (с наибольшим приближением компонентов к максимальным значениям).

Рис. 2 Пример закраски дерева. На третьем изображении явно видно, что заливка с жесткостью почти полностью закрасила всю листву одним цветом, заливкой же без параметров (второе изображение) разноцветную листву закрасить невозможно.