Страницы: 1 2 След.
RSS
Количество цветов в произвольном диапазоне R+G+B
 
Всем привет!
Ноги здесь
Задача проста:
Сколько цветов RGB будет в произвольно задаваемом диапазоне (к примеру 500-700), если этот диапазон получен сложением  R+G+B? Как вывести результат математически?

Полный диапазон 0(0+0+0) - 765(255+255+255)
Сначала я сделал неверное предположение, что это 200^3 = 8 млн.
Далее, просто набросал код:
Код
Sub run()
Debug.Print count(500, 700) '0-765
End Sub
Function count(iMin As Long, iMax As Long) As Long
Dim R As Long, G As Long, B As Long
For R = 0 To 255 Step 1
    For G = 0 To 255 Step 1
        For B = 0 To 255 Step 1
            If R + G + B >= iMin And R + G + B <= iMax Then count = count + 1
        Next
    Next
Next
End Function

Вышло - 3 123 751 цветов.

Понял, что это комбинаторика и набросал еще код, раскладывающий количество цветов на каждую единицу данного диапазона (0-765).
Код
Sub run()
Dim i As Long
For i = 0 To 765
    Cells(i + 1, 1) = count(i, i)
Next
End Sub
Function count(iMin As Long, iMax As Long) As Long
Dim R As Long, G As Long, B As Long
For R = 0 To 255 Step 1
    For G = 0 To 255 Step 1
        For B = 0 To 255 Step 1
            If R + G + B >= iMin And R + G + B <= iMax Then count = count + 1
        Next
    Next
Next
End Function

Результат в файле.
Какой математической функцией можно получить данный результат?

P.S.
Все знают, но здесь оставлю, что принимает Color и как работает функция RGB()
Excel.Color = RGB(R*256^0+G*256^1+B*256^2), диапазон 0-(256^3-1)
Изменено: bedvit - 27.02.2020 12:13:11
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Какой математической функцией можно получить данный результат?
count = 0,5 * i ^ 2 + 1,5 * i + 1               , [0; 255]
count = - i ^ 2 + 765 * i - 97154             , [254; 511]
count = 0,5 * i ^ 2 - 766,5 * i + 293761  , [510; 765]
Изменено: Evgenyy - 27.02.2020 22:34:33
 
Evgenyy, здорово! Боюсь даже спросить, как эти формулы были выведены?)
Есть подозрение, что можно вывести единую формулу для всего диапазона. Ведь диапазон зеркальный, относительно своей середины.

Эта задача имеет практические корни. Для генерации приятных цветов, для раскраски групп дубликатов, придумал такой алгоритм. В диапазоне до 400-500 цвета темные или химические, редко нормальные попадаются, выделяемый текст плохо видно, далее в диапазоне 500-700 светлее и как по-мне норм, далее 700-765 совсем светлые, на любителя. Выходит у меня есть 3 млн цветов для использования из 16 млн.
Изменено: bedvit - 27.02.2020 23:18:59
«Бритва Оккама» или «Принцип Калашникова»?
 
Может построить график и добавить формулу в описание/легенду/линию тренда? Точно не помню. Да интересно, что Еxcel предложит.
Изменено: bedvit - 27.02.2020 23:24:12
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
как эти формулы были выведены?
Проанализировал ряд, выявил закономерности, дальше чистая математика основанная на арифметических прогрессиях.
 
Вывел полиноминальную линию тренда (6й степени), ввел предложенную формулу и не получил нужный результат (данные не сошлись с линией тренда). Что сделал не так?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
полиноминальную линию тренда (6й степени)
Я думаю 6 степень - не лучший вариант. Можно попробовать 4-ю или 8-ю с положительным коэффициентом при степени.
Должна быть кривая, ветви которой направленны вверх, а в середине выпуклость (т.е. иметь 2 минимума, 1 максимум и 4 точки перегиба).
Изменено: Evgenyy - 28.02.2020 13:30:17
 
Evgenyy, у меня Excel максимум дает 6-ю, вы сможете сделать полиноминальную линию тренда 8й степени?
4й степени пробовал, вообще мимо.
Плюс остается вопрос почему предложенная Excel формула не работает?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
вы сможете сделать полиноминальную линию тренда 8й степени
Я не смогу, вообще всё древнее и комп и софт. Может кто из форумчан поможет.
 
Цитата
bedvit написал:
почему предложенная Excel формула не работает?
Виталий ,ну почему не работает, работает, как и вся аппроксимация работает с погрешностью.

Я вот все ни могу понять для чего это весь "экзорцизм".
Изменено: БМВ - 28.02.2020 13:45:03
По вопросам из тем форума, личку не читаю.
 
БМВ, работает с погрешность 15% это нормально? Причем величина достоверности аппроксимации 0.9994, т.е близка к единице. Это впрочем видно по красной линии тренда, которая почти совпадает с данными.
Для чего - просто хочу посчитать математически, а не макросом количество цветов. Если бы я не умел бы писать программы, как бы я посчитал?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
выделяемый текст плохо видно
Как-то извращался с цветами (одному студенту дали задание, как я понял, заполнить две таблицы 100х100 рандомными числами от 0 до 1000 и ячейки дубликатов выделить разными цветами), сделал на темный фон - светлый шрифт и наоборот. Получилось красиво, но бесполезно.
Скрытый текст
Изменено: aequit - 28.02.2020 14:32:45
 
Цитата
bedvit написал:
работает с погрешность 15% это нормально?
Виталий, ну задача то линии тренда не формулу построить, а кривую, она близка - факт, а то что значения полинома не совпади - так формула для справки дана :-)

Судя по коду и результату, мы считаем количества вариантов получения указаннго числа  0,1,2… путем суммирования чисел от одного до 255 из трех групп. Даже если комбинаторику задействовать то там будут факториалы и потребуются циклы.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
формула для справки дана
Михаил, а я то думал по этой формуле и строится линия тренда, нет? :)
Цитата
БМВ написал:
факториалы и потребуются циклы
били мысли, что это должно быть довольно тривиальное решение. Видимо я ошибался.
aequit, ваш код не запустился
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
и строится линия тренда
так и строится, но то что Значения x-y должны совпасть с исходными - никто не гарантировал :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
то там будут факториалы и потребуются циклы.
Насчёт факториалов не знаю, а вот то что задача похожа на задачу о линейном раскрое - это да.
Пусть есть доски от 500 до 700. Нужные детали 0 до 255. Нужно определить сколько раз можно используя ровно три детали, можно разделить доски на ровно на три детали.
 
Цитата
БМВ написал:
совпасть с исходными
в том и дело, что они должны совпасть не с исходными, а с самой линией тренда, а они не совпадают!
Андрей VG, Андрей привет! Звучит неплохо, продолжай :)
!
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
ваш код не запустился
Наверное, из-за библиотеки Microsoft Scripting Runtime, там раннее связывание. Проверял на Office 2010-32 битном.
 
Цитата
bedvit написал:
Для генерации приятных цветов, для раскраски групп дубликатов
Генерация приятных цветов функцией пользователя, написал на скорую руку.
 
Evgenyy, эта функция уже есть, если посмотреть ссылку в начале темы откуда ноги растут
Выглядит она так
Код
Function Generate_nice_color() As Long
Dim R As Long, G As Long, B As Long
Do
    Randomize
    R = Int(Rnd * 256)
    G = Int(Rnd * 256)
    B = Int(Rnd * 256)
Loop Until R + G + B > 500 And R + G + B < 700
Generate_nice_color = RGB(R, G, B)
End Function

она рандомная, и спектр цветов более богат, чем цвета которые генерируются рядом друг с другом.
«Бритва Оккама» или «Принцип Калашникова»?
 
Сваял тут в WolframCloud полиномы от 2 до 20 степени, вдруг пригодится https://www.wolframcloud.com/obj/krosav4ig26/Published/rgb%20test.nb
 
bedvit, сравнил обе функции. Особых различий не заметил. Да, палитра по-разнообразней.
 
Всё что смог вытянуть на арифметических прогрессиях. Может медведь дальше подсобит и развернёт?
 
Добрый день, коллеги! Математика здесь не может быть сложной.

Пусть S(N) - число целочисленных решений уравнения a+b=N, где 0<=a,b<=255. Понятно из ограничений, что:
S(N)=N+1 при 0<=N<=255
S(N)=511-N при 256<=N<=510

Кусочно-линейная функция из двух частей.

Пусть  теперь T(N) - число целочисленных решений для трех слагаемых с указанными ограничениями. Тогда, например, при 0<=N<=255 мы должны просуммировать S(k) от k=0 до N. В итоге, как и написал коллега в сообщениях #2 и #5, получаем многочлен 2-й степени. Аналогично для других интервалов. Такие штуки называются сплайнами.

Если нас интересует число целочисленных решений неравенства N1<=a+b+c<=N2, где a,b,c лежат в указанных интервалах, то после суммирования T(N) мы для каждого подинтервала получим многочлены 3-й степени.
Изменено: sokol92 - 28.02.2020 20:35:18
Владимир
 
aequit, раннее связывание отключил, посмотрите рис., Возможно причина в разных свойствах словарей, я не пользовался ранним связыванием библ. Microsoft Scripting Runtime.
Evgenyy, в любом случае спасибо за участие
Андрей Лящук, сильно, интересно, какой либо вариант даёт 100% попадание?)
Михаил, Андрей задача не критичная, на интерес ) Решение простым перебором быстро решается, даже библу писать не надо:)
Но я всегда думал математика и алгоритм сильнее тупой вычислительной мощи. Здесь видимо наоборот.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Но я всегда думал математика и алгоритм сильнее тупой вычислительной мощи. Здесь видимо наоборот.
не всегда. Вот пример , когда все есть , и уравнение и … но реально вспоминать как найти угол не очень получилось, за последние 30 лет позабылось все  :-) .

Цитата
sokol92 написал:
Математика здесь не может быть сложной.
пойду курну, а то чую выходные на смарку пойду. Такое в пятницу вечером  завернул , а  :D
Изменено: БМВ - 28.02.2020 21:00:19
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
за последние 30 лет позабылось все
Да уж лет 50 прошло с тех пор, как я решал такие задачи, а что-то помню :D  
Изменено: sokol92 - 28.02.2020 21:07:55
Владимир
 
sokol92, Владимир сильно! Завтра, на свежую голову еще раз перечитаю )
«Бритва Оккама» или «Принцип Калашникова»?
 
Off
Цитата
bedvit написал:
29 Фев 2020 00:12:24
sokol92 , Владимир сильно! Завтра, на свежую голову еще раз перечитаю )
Зы, я ж предупреждал, если в 0:12 писать что завтра, это почти сутки на освежевание головы :-)
По вопросам из тем форума, личку не читаю.
 
Off
Цитата
БМВ написал:
почти сутки на освежевание головы
медвежьей?😄
Страницы: 1 2 След.
Наверх