Adicionando um efeito de volume às linhas indicadoras - página 9

 

Gradiente horizontal sobre a lona.

Arquivos anexados:
gradient.mq5  5 kb
 

O código foi ligeiramente melhorado e também introduziu uma variável responsável pela velocidade de renderização:

input uchar speed=5;             // visible effect

A alteração da velocidade de visualização é feita atualizando a tela não após cada desenho da linha, mas em intervalos.

O tamanho da lacuna é calculado utilizando a operação aritmética "restante da divisão":

      if(i%speed==0)
         canvas_.Update()
Arquivos anexados:
gradient.mq5  5 kb
 

Apliquei cores diferentes aqui: apliquei uma cor com transparência (canal alfa 255) à cor de fundo (canal alfa 128). Tenho uma pergunta - qual fórmula é usada para calcular a cor final dos pixels para os modos COLOR_FORMAT_ARGB_RAW e COLOR_FORMAT_ARGB_NORMALIZE.

Se você se referir ao artigo Calculando a cor resultante, os cálculos não coincidem.

Альфа-канал — Википедия
Альфа-канал — Википедия
  • ru.wikipedia.org
В компьютерной графике альфа-композиция обозначает процесс комбинирования изображения с фоном с целью создания эффекта частичной прозрачности. Этот метод часто применяется для многопроходной обработки изображения по частям с последующей комбинацией этих частей в единое двумерное результирующее изображение. Таким образом, альфа канал...
 

Onde está errado: as constantes de cor estão armazenando os dados errados ou a função PrintFormat está funcionando mal?

Aqui está um roteiro que produz cores em forma inteira através do PrintFormat:

//+------------------------------------------------------------------+
//|                                                  Script_test.mq5 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- зададим прозрачность
   uchar alfa=0x80; // значение 0x80 означает 128/255=50 % прозрачности   
   //--- выведем преобразование в ARGB для цвета clrBlue
   PrintFormat("0x%.8X - clrBlue",clrBlue);
   PrintFormat("0x%.8X - clrBlue ARGB with alfa=0x80 (transparency 50%%)",ColorToARGB(clrBlue,alfa));
   //--- выведем преобразование в ARGB для цвета clrGreen
   PrintFormat("0x%.8X - clrGreen",clrGreen);
   PrintFormat("0x%.8X - clrGreen ARGB with alfa=0x80 (transparency 50%%)",ColorToARGB(clrGreen,alfa));
   //--- выведем преобразование в ARGB для цвета clrRed
   PrintFormat("0x%.8X - clrRed",clrRed);
   PrintFormat("0x%.8X - clrRed ARGB with alfa=0x0x80 (transparency 50%%)",ColorToARGB(clrRed,alfa));
  }
//+------------------------------------------------------------------+

Resultado de saída:

2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x80FF0000 - clrRed ARGB with alfa=0x0x80 (transparency 50%)
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x000000FF - clrRed
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x80008000 - clrGreen ARGB with alfa=0x80 (transparency 50%)
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x00008000 - clrGreen
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x800000FF - clrBlue ARGB with alfa=0x80 (transparency 50%)
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x00FF0000 - clrBlue

Por que oclrRed é representado como0x000000FF e não como0x00FF0000? Porque o vermelho é C'255,0,0'.

Por queclrBlue é representado como0x00FF0000 e não como0x0000FF? Porque azul é C'0,0,255'.

Arquivos anexados:
 
Isto é correto. É que o ARGB tem um formato de armazenamento diferente do Color.
 
TheXpert:
Isto é correto. É que o ARGB tem um formato de armazenamento de dados diferente em comparação com o Color.

O formato de gravação deve ser o mesmo: primeiro o canal alfa (se houver um), depois o RGB. De acordo com o tipo de ajuda Cor registrada azul através de literais:

C'0x00,0x00,0xFF'// azul

ou seja, em representação inteira, a cor azul (sem canal alfa) deve ser escrita como: 0x0000FF. Mas o roteiro de teste produz a cor azul de trás para frente:

2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x00FF0000 - clrBlue

Acontece que a cor é escrita de trás para frente nas constantes de cor.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип color
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип color
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип color - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
barabashkakvn:

Acontece que a cor é escrita de trás para frente em constantes de cor.

Sim. Esta ordem no literal não significa a mesma ordem em Cor
 

Com COLOR_FORMAT_ARGB_RAW, o métodoTransparentLevelSet com parâmetro "0" (transparência total) produz quase transparência, mas claramente não transparência total.

Arquivos anexados:
 
barabashkakvn:

COLOR_FORMAT_ARGB_RAW métodoTransparentLevelSet com parâmetro "0" (transparência total) torna a transparência próxima à transparência total, mas obviamente não à transparência total.

Esclarecimento: a transparência residual no nível de transparência "0" só é observada em x32. Não há transparência residual em x64:

x32


x64


Este comportamento kanvas no modo COLOR_FORMAT_ARGB_RAW é um bug ou uma característica de desenho em sistemas x32 e x64?

 
barabashkakvn:

Esclarecimento: a transparência residual no nível de transparência "0" só é observada em x32. Não há transparência residual em x64:

Este comportamento kanvas no modo COLOR_FORMAT_ARGB_RAW é um bug ou uma característica de desenho em sistemas x32 e x64?

O Service Desk é necessário... )))