Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
1

Доработка функции рассчета цвета

08.07.2022, 15:22. Показов 849. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую. Сделал функцию рассчета цвета в зависимости от значения. В простом варианте выглядит так.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function ColorCalc(Vl, Min, Max, ClMin, ClMax)
    Dim ClRez(3), i
    ClMin = GETRGB(ClMin)
    ClMax = GETRGB(ClMax)
    For i = 0 To 3
      ClRez(i) = ClMin(i) + (ClMax(i) - ClMin(i)) * (Vl - Min) / (Max - Min)
    Next
    Gradient = RGB(ClRez(0), ClRez(1), ClRez(2))
End Function
'возвращает массив с значениями для 3х цветов (RGB)
Function GETRGB(cl) As Long()
  Dim ar(3) As Long
  ar(2) = Int(cl / 65536)
  cl = cl - ar(2) * 65536
  ar(1) = Int(cl / 256)
  ar(0) = cl - ar(1) * 256
  GETRGB = ar  
End Function
Рассчитывается цвет для определенного значения (Vl) в зависимости от заданных макс. и мин. (Max, Min) значений и заданных 2х цветов (ClMax и ClMin).
По информации со страницы.. (можете найти по "Определить математически <<средний цвет>> из 2х"). попытался сделать рассчет по более правильной модели смешения цветов, однако немного примитивно.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Function ColorCalc(Vl, Min, Max, ClMin, ClMax, Optional adt1)
    Dim ClRez(3), i, Y, Y1, Y2, t, Cfr, Cfg, Cfb, MidVl, Hl
    ClMin = GETRGB(ClMin)
    ClMax = GETRGB(ClMax)
    MidVl = (Min + Max) / 2
    If Not IsMissing(adt1) Then
      Select Case adt1
        Case Is = 0: Cfr = 0.299: Cfg = 0.587: Cfb = 0.114 
        Case Is = 1: Cfr = 0.2125: Cfg = 0.7154: Cfb = 0.0721 
      End Select
      Y1 = ClMin(0) * Cfr + ClMin(1) * Cfg + ClMin(2) * Cfb
      Y2 = ClMax(0) * Cfr + ClMax(1) * Cfg + ClMax(2) * Cfb
      Y = (Y1 + Y2) / 2
      If Y2 > Y1 Then
        t = Y2 / Y
      Else
        t = Y1 / Y
      End If
'      Select Case Vl 
'        Case Is < MidVl: t = 1 + (t - 1) * (Vl - Min) * 2 / (Max - Min)
'        Case Is > MidVl: t = 1 + (t - 1) * (Max - Vl) * 2 / (Max - Min)
'      End Select
      Hl = (Max - Min) / 2
      t = 1 + (t - 1) * (Hl - Abs(Vl - MidVl)) / Hl
      't = 1 + (((t - 1) ^ 2) * (Hl - Abs(Vl - MidVl)) / Hl) ^ 0.5
    Else
      t = 1
    End If   
    For i = 0 To 3
          ClRez(i) = t * (ClMin(i) + (ClMax(i) - ClMin(i)) * (Vl - Min) / (Max - Min))
'          If ClRez(i) < 0 Then 
'              ClRez(i) = 0
'          ElseIf ClRez(i) > 255 Then
'              ClRez(i) = 255
'          End If
    Next
    ColorCalc = RGB(ClRez(0), ClRez(1), ClRez(2))
    CollAdd CfColl, Application.Caller.Address, Str(t)
End Function

Кратко, в чем суть - в функции рассчитывается коэффициент кореекции яркости для среднего цвета между 2х заданных (ClrMax и ClrMin) и в зависимости от заданных Vl(текущее значение), Max(максимальное), и Min(минимальное) данный коэффициент пересчитывается - ближе к "краям" (Max и Min) он должен уменьшаться до 1. Я сделал, уменьшение по линейной зависимости, правильнее было бы конечно сделать по какой-нибудь синусоиде. Собственно в чем вопрос, что нужно поменять в данном выражении t = 1 + (t - 1) * (Hl - Abs(Vl - MidVl)) / Hl, чтобы график приобрел более плавную форму?
Миниатюры
Доработка функции рассчета цвета  
Вложения
Тип файла: zip РассчетЦвета.zip (34.6 Кб, 0 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2022, 15:22
Ответы с готовыми решениями:

Функция рассчета определенного интеграла. (Передача функции как аргумента)
Есть функция пределенная как: float integrall(float (*argFunc)(float x) , float argTmin, float...

Доработка функции с векторами
Здравствуйте , нуждаюсь в помошь . В коде функции сделал ошибку и не могу понять какую ....

Скрипт рассчета PR
На многий сайта видет услугу по рассчету PR для заданного URL. Эти скрипты работают по принципу...

Проблема в формуле рассчёта
Нужно посчитать сумму по формуле (-1)^k * t^2 / (2*k)! * nu^((2k-1)*k) для k от 0 до 100, |nu|&lt;=1,...

17
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
08.07.2022, 15:34  [ТС] 2
Т.е. судя даже по виду наверное напрашивается что ближе к "краям" коэффициент должен повышаться очень медленно/мало, наверное синусоида была бы как-то оптимальнее.

Добавлено через 4 минуты
Забыл добавить описание по файлу - там нужно протянуть выделение по солбцу, чтобыотобразить пересчитанные цвета.
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
08.07.2022, 17:37  [ТС] 3
Нашел как это сделать
Visual Basic
1
2
3
Pi = WorksheetFunction.Pi
Ang = 2 * Pi * (Vl - Min) / (Max - Min)
t = 1 + (t - 1) * (Cos(Ang) * -0.5 + 0.5)
Стало так, не знаю, на сколько лучше, но в любом случае результат)
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
09.07.2022, 08:15  [ТС] 4
Было интересно применить вышеозначенный принцип рассчета цвета только не на RGB, а в какой-нибудь другой системе. Нашел одну живительную страничку, где изложены функции для конвертации почти всего во все (RGB, HSL, Long - стандартный формат Excel, Hex). Жаль правда, не было конвертаии Long - HSl и обратно, но были варианты RGB-HSL и обратно. Кое как сообразил по такой схеме
long - rgb - hsl (рассчет) - rgb - long. Однако, с HSL получился интересный результат, отличный от остальных (с нулевым значением что-то там не стыканулсь, добавил цвет вручную). Нет потери яркости, пожалй даже лишняя прибавка, и в середине высчитался цвет, вдимо соответствующий длине волны, между двумя крайними
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
10.07.2022, 10:27  [ТС] 5
Кому интересно можете порешать такую задачку. Нужно найти промежуточный цвет между двумя заданными в системе HSL/HSV в зависимости от заданных значений (макс, мин, текущее - A, B, C).
Значение А, допустим, 30
B - 90
C - 65
Т.е. AB = 60, AC = 35
Первый цвет, допустим как на рисунке, примерно будет 240°, 50%, 50% (первая цифра обозначает градусы (0 - 360°), вторые две % 0-100%)
Второй цвет, пусть будет 0°, 70%, 50%
3-е значение выщитывается проще, и я его напсал раным, главное посчитать H (hue), S (saturation)
Миниатюры
Доработка функции рассчета цвета  
Вложения
Тип файла: zip S2.zip (2.63 Мб, 12 просмотров)
Тип файла: zip ColorConversion.zip (54.9 Кб, 3 просмотров)
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
10.07.2022, 10:30  [ТС] 6
Гл. обр. надо выявить зависимость значений цвета от соотношения AC/AB
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
10.07.2022, 16:56  [ТС] 7
А задачка-то довольно не простая, сам в шоке, вроде простые треугольники, но формулы шибко длинные.. карпел я долго над задачей, даже пришлось прибегнуть к помощи онлайн-упростителя формул, получилось в итоге так.
Если за обозначение вышеобозначенного принять
a = S1
b = S2
c = cos(α) = H2 - H1
n = (Max-Val)/(Max-Min)
S3 = (a^2(n-2)n-2abc(n-1)n+b^2((n-1)^2))^0.5
получилось из упрощения вот этого
Кликните здесь для просмотра всего текста
S3 = ((n*((a^2 + b^2 - 2*a*b*c)^0.5))^2 + b^2 - 2*(n*((a^2 + b^2 - 2*a*b*c)^0.5))*b*(a^2/b + b -

a*c)/((a^2 + b^2 - 2*a*b*c)^0.5))^0.5

Осталось проверить, как будет ли работать формула в макросе, или я горе-математик )
0
828 / 479 / 185
Регистрация: 09.03.2009
Сообщений: 1,646
11.07.2022, 09:14 8
Не вникал, но. Когда-то давно нам надо было выводить график движения поезда на графопостроитель. Там тоже получались треугольники и адские формулы. Тогда упростили тем, что использовали перенос и поворот системы координат, совместив ее временно не с основными осями, а с треугольником. Формулы взяли в справочнике Выгодского. То есть система переносится, просто считается нужная точка треугольника, система возвращается назад. Вдруг вам поможет.
1
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
11.07.2022, 09:43  [ТС] 9
Я прикидывал уже в макросе, и посчитал цвет для значений заданных в сабже. Решил, что лучше не собирать все в общую формулу для, допустим, "S3" или "H3", а разбивать на этапы поскольку в рассчете и того и другого участвуют одни и те же величины, и получается не так страшно.

Добавлено через 11 минут
Точнее не сабже а в 5 топике
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
11.07.2022, 12:45  [ТС] 10
Так выглядит рассчет среднего цвета HSL/HSV для конретного случая
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sub ColorCalc()
  Dim H1, H2, H3, S1, S2, S3, L1, L2, L3, Min, Max, Vl, N, CosA, CosB, CosY, AB, BC
  Static pi As Double
  If pi = 0 Then pi = WorksheetFunction.pi
  
  Min = 30: Max = 90: Vl = 60 'Vl = 65
'  H1 = 240: S1 = 50:  L1 = 50
'  H2 = 0:   S2 = 70:  L2 = 50
  H1 = 0: S1 = 100:  L1 = 50
  H2 = 120:   S2 = 100:  L2 = 50
  
  CosA = Cos((H2 - H1) * pi / 180)
  N = (Max - Vl) / (Max - Min)
  AB = (S1 ^ 2 + S2 ^ 2 - 2 * S1 * S2 * CosA) ^ 0.5
  CosB = (AB ^ 2 + S2 ^ 2 - S1 ^ 2) / (2 * AB * S2)
  BC = AB * N
  S3 = (BC ^ 2 + S2 ^ 2 - 2 * BC * S2 * CosB) ^ 0.5
  CosY = (S2 ^ 2 + S3 ^ 2 - BC ^ 2) / (2 * S2 * S3)
  H3 = H2 - Acos(CosY) * 180 / pi
  L3 = L1 + (L2 - L1) * (1 - N)
  
  With ActiveCell
      .Value = H3
      .Offset(, 1) = S3
      .Offset(, 2) = L3
  End With
End Sub
Справа цвета, которые я приводил в 5 топике, слева как обычно рассчет среднего цвета между чистым зеленым и красным. Результат ( можно поместить между аддитивным RGB-смешиванием без коэффициентов (31110) и значением рассчитанным с коэффициентами, кторые давал Порев в книге 2002 г. (41136). С фотошоповскими коэффициентами - 47821. Еще бы через HSV посчитать, но что-то с функцией, взятой с инета не задалось, не правильно считает.
Изображения
 
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
11.07.2022, 13:00  [ТС] 11
Забыл добавить функцию к общему повествованию. Пишут рабтает быстрее, чем worksheets.acos при многократных вызовах
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Function Acos(ByVal a As Double) As Double
    Static pi As Double
    If pi = 0 Then pi = WorksheetFunction.pi
    If a = 1 Then
      Acos = 0
    ElseIf a = -1 Then
      Acos = pi
    Else
      Acos = Atn(-a / Sqr(-a * a + 1)) + 2 * Atn(1)
    End If
End Function
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
11.07.2022, 18:33  [ТС] 12
Корочи вот так, уйма головняка и эффект "мутной воды", надо еще будет CMYK попробовать, что-то подсказывает, что с ним все значительно проще, там все значения проценты и функции конвертации простые
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
12.07.2022, 19:11  [ТС] 13
Добавил для сравнения системы рассчет среднего цвета в системах XYZ и LAB, методом простого среднего арифметического между соответствующими значениями. Для HSL рассчет выше-описанным методом, который не подошел для HSV, все равно высчитывает желтый, видимо там нужен какой-то другой подход.. Видно у HSL лишний сдвиг в синюю сторону, LAB, рекомендованный для градиентов дает заметный перевес в сторону красного, очень интересный вариант у XYZ.
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
12.07.2022, 21:14  [ТС] 14
XYZ, почти нормально
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
13.07.2022, 08:22  [ТС] 15
Осенило. Там где я про синусоиду писал, нужна не синусоида, а дуга окружности - сегмент. Правда вопрос, как лучше считать коэф. по CE или CD.
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
13.07.2022, 20:34  [ТС] 16
LAB
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
13.07.2022, 20:37  [ТС] 17
При мутных оттенках виден недостаток метода описанного в начале.
Миниатюры
Доработка функции рассчета цвета  
0
491 / 390 / 49
Регистрация: 08.02.2017
Сообщений: 1,567
13.07.2022, 20:48  [ТС] 18
Информация
HSB / HSV

HSB (также известна как HSV) похожа на HSL, но это две разные цветовые модели. Они обе основаны на цилиндрической геометрии, но HSB/HSV основана на модели «hexcone», в то время как HSL основана на модели «bi-hexcone». Художники часто предпочитают использовать эту модель, принято считать что устройство HSB/HSV ближе к естественному восприятию цветов. В частности, цветовая модель HSB применяется в Adobe Photoshop.

HSB/HSV расшифровывается как Hue (цвет/оттенок), Saturation (насыщенность), Brightness/Value (яркость/значение).

Hue задаёт положение цвета на цветовом круге (от 0 до 360). Saturation является процентным значением насыщенности (от 0% до 100%). Brightness является процентным значением яркости (от 0% до 100%).
XYZ

Цветовая модель XYZ (CIE 1931 XYZ) является чисто математическим пространством. В отличие от RGB, CMYK, и других моделей, в XYZ основные компоненты являются «мнимыми», то есть вы не можете соотнести X, Y, и Z с каким-либо набором цветов для смешивания. XYZ является мастер-моделью практически всех остальных цветовых моделей, используемых в технических областях.
LAB

Цветовая модель LAB (CIELAB, «CIE 1976 L*a*b*») вычисляется из пространства CIE XYZ. При разработке Lab преследовалась цель создания цветового пространства, изменение цвета в котором будет более линейным с точки зрения человеческого восприятия (по сравнению с XYZ), то есть с тем, чтобы одинаковое изменение значений координат цвета в разных областях цветового пространства производило одинаковое ощущение изменения цвета.
0
13.07.2022, 20:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2022, 20:48
Помогаю со студенческими работами здесь

Символический метод рассчёта
Помогите пожалуйста! Задача: Параллельный контур RLC имеет следующие параметры: линейная частота...

Программа для рассчета константы е
У Дейтлов есть задачка: Как вообще это е рассчитывается?

Запись в файл результатов рассчета
нужно рассчитать расстояние до объекта в небе в любой момент времени, принять шаг дискретизации...

Программа для рассчёта по формуле
Доброго времени суток! Нужно сделать программу что бы она рассчитывала при нажатии на баттон по...

Модуль рассчета стоимости доставки
Доброе время суток. Вот появилась потребность в модуле для Joomla3.x - рассчет стоимости доставки в...

Ошибка рассчета в StringGrid C++ Builder
Ошибка при подсчете общей суммы за выбранный период{ int m=0; if (Edit1-&gt;Text==&quot;&quot;) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru