На главную
ПРАВИЛА 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,1091 ]   [ 17 queries used ]   [ Generated: 13.10.19, 21:14 GMT ]