Самый простой способ получить приблизительную оценку — получить ограничивающую рамку треугольника, а затем перебрать каждую строку, сохраняя подсчет количества цветных пикселей и общих сумм каждого канала, а затем деление в конце. (Это также дает вам возможность предварительно вычислить суммы отдельных строк, что полезно, если вам нужно вычислить очень большое количество треугольников T.) Однако это наиболее точно для очень больших треугольников; чем меньше треугольники и чем меньше наименьший угол в треугольнике, тем больше проблем возникает, когда пиксели, которые находятся внутри треугольника лишь частично, занижаются или завышаются.
Менее простой способ значит взять ту же самую ограничивающую рамку; затем для каждого пикселя в ограничивающей рамке вычислите площадь каждого пикселя, который также содержится в треугольнике; затем добавьте к промежуточной сумме площадь пикселя и средний цвет, умноженный на площадь пикселя. Однако создание многоугольника для каждого пикселя непрактично медленно.
Хотя я специально ищу Pythonic-ответы и библиотеки, в которых могут быть способы его реализации, около 90% этого будет найдя правильный алгоритм, 10% будут его реализовывать.
РЕДАКТИРОВАТЬ: Вот иллюстрация некоторых вырожденных случаев, включающих маленькие треугольники, пересекающие границы двух областей разных цветов, чтобы проиллюстрировать проблемы с простыми методами.

Для иллюстрации я создал изображение, в котором используются только два цвета: пурпурный и синий, на поле высотой 6 пикселей и шириной 16 пикселей. Каждое из них иллюстрирует ошибки, возникающие при различных приближениях.
- Если мы просто посчитаем пиксели, центральные точки которых находятся в треугольнике, площадь треугольника A равна 12 (8 пурпурных, 4 синих), площадь треугольника B равна 2 (2 пурпурный), а площадь треугольника C равна 4 (3 пурпурных, 1 синий). Это явно неверная оценка как общей площади каждого треугольника, так и соотношения пурпурного цвета и синего цвета в каждом треугольнике.< /li>
Если мы посчитаем любую часть пикселя находящейся «внутри» треугольника, площадь треугольника A будет равна 19 (10 пурпурных пикселей и 9 синих пикселей), площадь треугольника B будет равна 8. (4 пурпурных пикселя и 4 синих пикселя), а площадь треугольника C также равна 8 (4 пурпурных пикселя и 4 синих пикселя). Несмотря на то, что треугольники B и C имеют одинаковую «площадь» при подсчете всех пикселей, частично обрезанных треугольником, пропорции их площадей заметно различны и не должны иметь одинаковый средний цвет. - Если мы посчитаем только пиксели, которые полностью содержатся внутри треугольника, площадь треугольника A будет равна 3 (2 пурпурных пикселя и 4 синих пикселя), а площадь треугольников B и C будет равна 0. Это в корне неверно.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ver-bitmap
Мобильная версия