На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Получить результирующий цвет от 2-х источников света
Хочу понять принцип совмещения цветов. Например, есть 2 одинаковых источника света, у которых RGB R=128, G=0, B=0. Если эти 2 источника совмещаются в одной точке, то получим результирующий свет R=128*2, G=0*2, B=0*2 или по какой формуле будет расчёт?
попадалось такое для нахождения суммирующего цвета для диапазона ячеек

ExpandedWrap disabled
    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
Если с гамма коррекцией:
ExpandedWrap disabled
    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
Спасибо. Тут вместо v As Long можно v As Integer ;)
Сообщение отредактировано: BlackSun -
Цитата BlackSun @
Тут вместо v As Long можно v As Integer

Можно, просто As Long быстрее работает (хотя при использовании степеней, это не так важно).
Сообщение отредактировано: Mikle -
Хочешь сказать, что CLng быстрее CInt?
Арифметика с Long переменными быстрее, чем с Integer потому, что код, режим процессора 32-битный, 16-битные команды дополнены префиксом.
А скорость конкретно CLng и CInt зависит от многих факторов, в том числе от того, какой тип данных берётся изначально.
1. По умолчанию в VB идёт тип Integer, т.е. код
ExpandedWrap disabled
    Dim v As Long
      v = ((v1 / 255) ^ 2.2 + (v2 / 255) ^ 2.2) ^ (1 / 2.2) * 255

будет заменён на
ExpandedWrap disabled
      v = CLng((v1 / 255) ^ 2.2 + (v2 / 255) ^ 2.2) ^ (1 / 2.2) * 255)

или нет?

2. 32-x битные регистры делятся на два 16-ти битных, и расширения Integer до Long не должно происходить. Может именно поэтому VB по умолчанию имеет тип Integer, т.к. большинству операций его достаточно и они должны выполняться "без выкрутасов".
Сообщение отредактировано: BlackSun -
teger медленнее, чем Long. Integer переменная использует 4 байта, столько же, сколько и Long.
Мои религиозные убеждения не позволяют мне комментировать код.
Моё мировоззренье таково: в программе комментария ни одного!
3. Арифметика-то идёт с Byte и Integer, а в Long пишется рез-т.

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

с каких это пор?
Цитата BlackSun @
Арифметика-то идёт с Byte и Integer

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

Это касается только целочисленных констант от -32768 до 32767.
Там, кстати, можно раскрыть скобки и сократить вычисления. То, что я дал, следует воспринимать не как готовый код, а как демонстрацию математики происходящего.
Сообщение отредактировано: Mikle -
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1192 ]   [ 22 queries used ]   [ Generated: 19.04.19, 06:33 GMT ]