Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата BlackSun @
Тут вместо v As Long можно v As Integer

Можно, просто 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 пишется рез-т.

Добавлено
Цитата MIF @
Integer переменная использует 4 байта

с каких это пор?

Автор: Mikle 16.04.19, 17:12
Цитата BlackSun @
Арифметика-то идёт с Byte и Integer

В данном конкретном примере вся арифметика работает в Double, потому что первое выполняемое действие - деление.
Просто это уже привычка, когда арифметика целочисленная, то Long оптимальнее, Integer я практически никогда не использую, кроме случаев, когда это необходимо.
Цитата BlackSun @
По умолчанию в VB идёт тип Integer

Это касается только целочисленных констант от -32768 до 32767.
Там, кстати, можно раскрыть скобки и сократить вычисления. То, что я дал, следует воспринимать не как готовый код, а как демонстрацию математики происходящего.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)