Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Visual Basic: Общие вопросы > Получить результирующий цвет от 2-х источников света |
Автор: BlackSun 22.03.19, 20:15 |
Хочу понять принцип совмещения цветов. Например, есть 2 одинаковых источника света, у которых RGB R=128, G=0, B=0. Если эти 2 источника совмещаются в одной точке, то получим результирующий свет R=128*2, G=0*2, B=0*2 или по какой формуле будет расчёт? |
Автор: alex77755 23.03.19, 06:19 |
попадалось такое для нахождения суммирующего цвета для диапазона ячеек <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> For Each c In aRange.Cells i = c.Interior.Color If i <> 16777215 Then k = k + i R = R + 1 End If Next End If MainColor = k / R |
Автор: Mikle 23.03.19, 10:12 |
Если с гамма коррекцией: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> r = GammaAdd(r1, r2) g = GammaAdd(g1, g2) b = GammaAdd(b1, b2) Function GammaAdd(v1 As Byte, v2 As Byte) As Byte Dim v As Long v = ((v1 / 255) ^ 2.2 + (v2 / 255) ^ 2.2) ^ (1 / 2.2) * 255 If v > 255 Then GammaAdd = 255 Else GammaAdd = v End Function |
Автор: BlackSun 07.04.19, 18:03 |
Спасибо. Тут вместо v As Long можно v As Integer |
Автор: Mikle 08.04.19, 07:40 |
Можно, просто As Long быстрее работает (хотя при использовании степеней, это не так важно). |
Автор: BlackSun 15.04.19, 16:58 |
Хочешь сказать, что CLng быстрее CInt? |
Автор: Mikle 15.04.19, 18:34 |
Арифметика с Long переменными быстрее, чем с Integer потому, что код, режим процессора 32-битный, 16-битные команды дополнены префиксом. А скорость конкретно CLng и CInt зависит от многих факторов, в том числе от того, какой тип данных берётся изначально. |
Автор: BlackSun 16.04.19, 14:25 |
1. По умолчанию в VB идёт тип Integer, т.е. код <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim v As Long v = ((v1 / 255) ^ 2.2 + (v2 / 255) ^ 2.2) ^ (1 / 2.2) * 255 будет заменён на <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> v = CLng((v1 / 255) ^ 2.2 + (v2 / 255) ^ 2.2) ^ (1 / 2.2) * 255) или нет? 2. 32-x битные регистры делятся на два 16-ти битных, и расширения Integer до Long не должно происходить. Может именно поэтому VB по умолчанию имеет тип Integer, т.к. большинству операций его достаточно и они должны выполняться "без выкрутасов". |
Автор: MIF 16.04.19, 14:41 |
teger медленнее, чем Long. Integer переменная использует 4 байта, столько же, сколько и Long. |
Автор: BlackSun 16.04.19, 14:48 |
3. Арифметика-то идёт с Byte и Integer, а в Long пишется рез-т. Добавлено с каких это пор? |
Автор: Mikle 16.04.19, 17:12 |
В данном конкретном примере вся арифметика работает в Double, потому что первое выполняемое действие - деление. Просто это уже привычка, когда арифметика целочисленная, то Long оптимальнее, Integer я практически никогда не использую, кроме случаев, когда это необходимо. Это касается только целочисленных констант от -32768 до 32767. Там, кстати, можно раскрыть скобки и сократить вычисления. То, что я дал, следует воспринимать не как готовый код, а как демонстрацию математики происходящего. |