На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Разделение цвета на его состовляющие цвета
    Вот допустим у меня есть три цвета: clRed, clBlue, clWhite которые я смешиваю и получаю 16711871 ($00BF7FBF),

    ExpandedWrap disabled
      function SummColors2(C1, C2: TColor): TColor;
      begin
            Result :=   RGB(
                            (GetRValue(C1) - (GetRValue(C1) - GetRValue(C2)) div 2)  ,
                            (GetGValue(C1) - (GetGValue(C2) - GetGValue(C2)) div 2)  ,
                            (GetBValue(C1) - (GetBValue(C2) - GetBValue(C2)) div 2)) ;
      end;
      ...
       SummColors2( SummColors2(clRed, clBlue), clWhite ) = 16711871
      ...

    а как теперь этот цвет 16711871 ($00BF7FBF) разделить на исходные цвета, которые при сложении дадут тот же результат 16711871 ($00BF7FBF)?

    Мне на ум приходит только брутфорсить все возможные комбинации RGB пока не будет совпадения с исходным, но это долго, может есть какой-то более быстрый вариант ?
    Сообщение отредактировано: Jiro -
      Вариант 1. Использовать определение типа данных
      ExpandedWrap disabled
        type
          TRGBunion = packed record
            case Byte of
              0: (clRed, clGreen, clBlue, Reserved: Byte);
              1: (clLoWord, clHiWord: Word);
              2: (clColor: Cardinal);
          end;
         
        var a : TRGBunion;
         
        begin
          a.clColor := $BF7FBF;
          WriteLn(a.clRed, ' ', a.clGreen, ' ', a.clBlue);
         
          a.clRed   := 255;
          a.clGreen := 0;
          a.clBlue  := 127;
          WriteLn(Format('0x%6X', [a.clColor]));
          ReadLn;
        end.


      Тогда при обращении к нужному полю вы будете получать нужный вариант и при этом никаких лишних операций не потребуется. Компилятор сам будет знать как взять нужную компоненту цвета или все целиком.

      Вариант 2. Использовать алгебру логики
      ExpandedWrap disabled
        var clColor : Cardinal = 0; clRed : Byte = $BF; clGreen : Byte = $7F; clBlue : Byte = $BF;
        begin
          clColor := (clRed and 255) or ((clGreen and 255) shl 8) or ((clBlue and 255) shl 16);
          WriteLn(Format('0x%6X', [clColor]));
        // Обратное
          clColor := $FFFFFF;
         
          clRed   :=  clColor and 255;
          clGreen := (clColor shr 8) and 255;
          clBlue  := (clColor shr 16) and 255;
          WriteLn(clRed, ' ', clGreen, ' ', clBlue);
          ReadLn;
        end.


      А вот оба этих метода в одной программе
      ExpandedWrap disabled
        program Project1;
         
        uses
          SysUtils, Classes;
         
        type
          TRGBunion = packed record
            case Byte of
              0: (clRed, clGreen, clBlue, Reserved: Byte);
              1: (clLoWord, clHiWord: Word);
              2: (clColor: Cardinal);
          end;
         
        var
          unColor: TRGBunion;
          clColor: Cardinal;
          clRed, clGreen, clBlue: Byte;
         
        begin
          clRed   := 255;
          clGreen := 127;
          clBlue  := 63;
         
          clColor := (clRed and 255) or ((clGreen and 255) shl 8) or ((clBlue and 255) shl 16);
          WriteLn(Format('0x%06X - логические операции', [clColor]));
         
          clColor := $BF7FBF;
         
          clRed   :=  clColor and 255;
          clGreen := (clColor shr 8)  and 255;
          clBlue  := (clColor shr 16) and 255;
         
          WriteLn(Format('0x%02X 0x%02X 0x%02X - обратное преобразование', [clRed, clGreen, clBlue]));
         
          with unColor do begin
            clRed   := 255;
            clGreen := 127;
            clBlue  := 63;
         
            WriteLn(Format('0x%06X - определение структуры данных в памяти', [clColor]));
         
            clColor := $BF7FBF;
         
            WriteLn(Format('0x%02X 0x%02X 0x%02X - обратно в компоненты цвета', [clRed, clGreen, clBlue]));
          end;
          ReadLn;
        end.
      А это вывод это программы
      ExpandedWrap disabled
        0x3F7FFF - логические операции
        0xBF 0x7F 0xBF - обратное преобразование
        0x3F7FFF - определение структуры данных в памяти
        0xBF 0x7F 0xBF - обратно в компоненты цвета
      Сообщение отредактировано: macomics -
        Я немного подправил вопрос что бы было понятнее в чём задача.

        macomics
        Похоже вы вопрос не поняли ...
        Сообщение отредактировано: Jiro -
          Так тут простая математика. Просто сделайте обратные операции и решите систему с 3 неизвестными от 3 уравнений
            Цитата macomics @
            Так тут простая математика. Просто сделайте обратные операции и решите систему с 3 неизвестными от 3 уравнений


            интересно как вы себе это представляете, потому, что я это представить немогу...

            Добавлено
            зы: до меня сейчас дошло, что задача решения не имеет. :facepalm:
              ExpandedWrap disabled
                // GetRValue(C1) - (GetRValue(C1) - GetRValue(C2)) div 2; (X1 - (X1 - X2)) / 2 = R
                // (GetGValue(C1) - (GetGValue(C2) - GetGValue(C2)) div 2); (Y1 - (Y2 - Y2)) / 2 = G
                // (GetBValue(C1) - (GetBValue(C2) - GetBValue(C2)) div 2); (Z1 - (Z2 - Z2)) / 2 = B
                 
                // (X1 - (X1 - X2)) / 2 = R; X2 / 2 = R; X2 = 2 * R;
                // (Y1 - (Y2 - Y2)) / 2 = G; Y1 / 2 = G; Y1 = 2 * G;
                // (Z1 - (Z2 - Z2)) / 2 = B; Z1 / 2 = B; Z1 = 2 * B;
                 
                function backSummColors2(CX: TColor; out C1: TColor): TColor;
                begin
                      C1     :=   RGB(0, 2 * GetGValue(CX), 2 * GetBValue(CX));
                      Result :=   RGB(2 * GetRValue(CX), 0, 0) ;
                end;


              При таких формулах найти все компоненты исходных цветов нельзя, но вывести обратные формулы можно, хотя они не дадут вам все исходные данные.
              Сообщение отредактировано: macomics -
                По сути, изначальное преобразование - весьма какоета странное! Ассиметричное какоета:

                Result := RGB(
                (GetRValue(C1) - (GetRValue(C1) - GetRValue(C2)) div 2) ,
                (GetGValue(C1) - (GetGValue(C2) - GetGValue(C2)) div 2) ,
                (GetBValue(C1) - (GetBValue(C2) - GetBValue(C2)) div 2)) ;

                Вангую - лутше выяснить суть первоначальных преобразований, ну а потом уже напрягаться.
                  Majestio
                  Ну это первое что нашлось по теме смешивания цветов, чего-то более лучшего не нашлось.
                  Как пишут в интернетах, идеального алгоритма нету.
                  Сообщение отредактировано: Jiro -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0302 ]   [ 16 queries used ]   [ Generated: 7.10.24, 19:58 GMT ]