Это линейная комбинационная задача в трех измерениях. У вас есть базовый набор векторов. В приведенном вами примере это
b1 = (FF, 00, 00)
b2 = (00, AA, 33)
b3 = (FF, FF, FF)
Вы пытаетесь найти линейную комбинацию этих трех векторов, чтобы получить вектор (3A, 5F, 34)
.
Преобразуйте векторы в целые числа и примените стандартные методы решения систем линейных уравнений:
b1 = (255, 0, 0)
b2 = ( 0, 176, 51)
b3 = (255, 255, 255)
need = ( 58, 95, 52)
Теперь вам нужно найти коэффициенты x (для b1), y (b2), z (b3), такие что
need = x*b1 + y*b2 + z*b3
Расширено, это:
255x + 0y + 255z = 58
0x + 176y + 255z = 95
0x + 51y + 255z = 52
У вас есть три уравнения с тремя переменными.
Вы можете взять это отсюда? И в Python, и в Java есть пакеты линейного решения для выполнения арифметики за вас - нет необходимости в искусственном интеллекте.
Получите проценты
Необходимые пропорции: x, y, z
. Обратите внимание, что это , а не проценты: нет никакой гарантии, что данная смесь получится в виде коэффициентов, которые добавляют к 1. Рассмотрим простой случай: зеленый 00FF00
полной интенсивности и синий 0000FF
полной интенсивности, но мы хочу что-то в диапазоне чирок 00C0C0
. Полученная смесь (0,0, 0,75, 0,75) - не в процентах.
Определить несколько решений
Это линейная система, дающая нам три возможных случая:
- Несоответствие: два уравнения являются параллельными плоскостями, и возможных решений не существует.
- Точечное решение: уравнения описывают три плоскости, пересекающиеся в точке. Существует ровно одно алгебраическое решение. Возможно, что один или несколько коэффициентов отрицательны, что означает, что не существует практического решения.
- Множественные решения: уравнения пересекаются в общей линии ... или все три уравнения описывают одинаковую плоскость. В любом из этих случаев решение системы приводит к параметризованному уравнению с одной (прямой) или двумя (плоскими) переменными. В любом из этих случаев существуют бесконечные решения.
Какой бы инструмент вы ни выбрали (или напишите) для решения системы уравнений, он должен вернуть параметризованную форму для случая 3.