Roman Konopelko: Na classe CGraphic, eu substituí o tipo de cor por uint em todos os lugares, como você pediu.
Além disso, acrescentei novos métodos à classe CCanvas, que permitem desenhar primitivos com espessura especificada: Em linha com a inovação do CCanvas, eu ampliei as propriedades do CCurve: Ao desenhar uma curva com linhas, você pode agora especificar a espessura das linhas e o estilo de suas extremidades.
A manipulação de estrias (interpolação com curvas de Bézier) foi revisada. Sua implementação foi transferida da classe CGraphics diretamente para o CCanvas, o que permite a construção de estrias fora da biblioteca gráfica.
Além disso, foi adicionado um algoritmo para renderizar spline fechado.
Como resultado, a classe CCanvas tem agora dois novos métodos públicos.
Estes métodos permitem desenhar estrias em um determinado estilo e com uma determinada espessura.
Como as curvas de Bezier descrevem círculos e elipses de forma bastante precisa, não há necessidade óbvia de aumentar a classe CCanvas com novos métodos para tornar estes primitivos com uma determinada espessura.
O exemplo de aproximação de elipse por curvas Bézier baseadas no método PolygoneSmooth:
#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+//| Get arrays with ellipse coordinates |//+------------------------------------------------------------------+void Ellipse(int &x[],int &y[])
{
int xc = 750;
int yc = 300;
int rx = 300;
int ry = 150;
ArrayResize(x,16);
ArrayResize(y,16);
int i=0;
for(double fi=0; fi<2*M_PI; fi+=M_PI_4/2,i++)
{
x[i]=(int)MathRound(xc+cos(fi)*rx);
y[i]=(int)MathRound(yc+sin(fi)*ry);
}
}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
CCanvas canvas;
canvas.CreateBitmapLabel(0,0,"Canvas",0,0,1500,600);
canvas.Erase(ColorToARGB(clrWhite));
int x[];
int y[];
Ellipse(x,y);
canvas.PolygoneSmooth(x,y,ColorToARGB(clrBlack),20,STYLE_SOLID,LINE_END_BUTT,0.5,1);
canvas.Arc(750,300,300,150,0,M_PI*2,ColorToARGB(clrRed));
canvas.Update();
}
Outro passo possível para a versatilidade da biblioteca de gráficos: um modo de desenho de curvas personalizado CURVE_CUSTOM.
Este modo eliminará a necessidade de herdar a classe CGraphic e sobrecarregar os métodos de plotagem a fim de traçar uma curva diferente do que as ferramentas padrão da biblioteca permitem.
Para implementar este modo CURVE_CUSTOM novas propriedades serão adicionadas à classe CCurve.
Como a classe CCandle é descendente da classe CObject, todos os castiçais que queremos desenhar, podemos escrevê-los sequencialmente no objeto da classe CArrayObj. Esta matriz entrará em nosso método de desenho personalizado como o parâmetro cbdata. Como resultado, o método de desenho do castiçal será o seguinte.
//+------------------------------------------------------------------+//| Custom method for plot candles |//+------------------------------------------------------------------+void PlotCandles(double &x[],double &y[],int size,CGraphic *graphic,CCanvas *canvas,void *cbdata)
{
//--- check obj
CArrayObj *candles=dynamic_cast<CArrayObj*>(cbdata);
if(candles==NULL || candles.Total()!=size)
return;
//--- plot candles for(int i=0; i<size; i++)
{
CCandle *candle=dynamic_cast<CCandle*>(candles.At(i));
if(candle==NULL)
return;
//--- primary calculateint xc=graphic.ScaleX(x[i]);
int width_2=candle.CandleWidth()/2;
int open=graphic.ScaleY(candle.OpenValue());
int close=graphic.ScaleY(candle.CloseValue());
int high=graphic.ScaleY(candle.HigthValue());
int low=graphic.ScaleY(candle.LowValue());
uint clr=(open<=close) ? candle.CandleColorIncrement() : candle.CandleColorDecrement();
//--- plot candle
canvas.LineVertical(xc,high,low,0x000000);
//--- plot candle real body
canvas.FillRectangle(xc+width_2,open,xc-width_2,close,clr);
canvas.Rectangle(xc+width_2,open,xc-width_2,close,0x000000);
}
}
3. Para simplificar, todos os castiçais serão gerados de forma aleatória. E assim geramos seqüencialmente 10 castiçais e preenchemos o objeto da classe CArrayObj com eles. Depois criamos o objeto CGraphics e adicionamos uma curva a ele, enquanto especificamos que ele será desenhado usando nossa função PlotCandles. Também precisamos mudar os valores máximos e mínimos do eixo y, para que nossas velas sejam totalmente visíveis.
Este exemplo causou o congelamento do computador. O que fiz: depois de colocar o indicador no gráfico no editor, joguei com diferentes combinações de linhas 87 e 88 (quando uma de cada vez, quando juntas)
Este exemplo causou o congelamento do computador. O que fiz: depois de colocar o indicador no gráfico no editor, joguei com diferentes combinações de linhas 87 e 88 (quando uma de cada vez, quando juntas)
Repetiu a conquista duas vezes. Eu não registrei a seqüência de ações. A terceira vez é trivial, tenho medo de verificar.
Adicionado: construir 1607 x64
Repetimos o recorde hoje - computadores mortos pendurados, conseguiram ver o consumo de RAM aumentar de 2GB para 5,5GB. Parece ter conseguido fechar o cronograma, mas o computador está pendurado há cinco minutos.
Desta vez coloquei um limite para o tamanho da matriz - não mais de 300 elementos. Como você pode ver, isso não ajudou 🤔
Jbug não entendeu, eu fiz isto: pairou um indicador e não comentou/comentou uma ou duas linhas e compilou. Acabou escrevendo a partir de um tablet, o laptop saiu.
O percevejo não conseguiu, eu fiz isto: passei o mouse sobre o indicador e comentei/comentei uma ou duas linhas e compilei. Acabou escrevendo a partir de um tablet, o laptop saiu.
Assim, o laptop depois de um reinício duro voltou à vida, mas não quero conduzir mais experiências destrutivas - há vários Expert Advisors rodando no laptop, então não há desejo de pegar um congelamento por uma hora inteira.
Na classe CGraphic, eu substituí o tipo de cor por uint em todos os lugares, como você pediu.
Além disso, acrescentei novos métodos à classe CCanvas, que permitem desenhar primitivos com espessura especificada:
Em linha com a inovação do CCanvas, eu ampliei as propriedades do CCurve:
Ao desenhar uma curva com linhas, você pode agora especificar a espessura das linhas e o estilo de suas extremidades.
Isso é simplesmente fantástico.
A manipulação de estrias (interpolação com curvas de Bézier) foi revisada. Sua implementação foi transferida da classe CGraphics diretamente para o CCanvas, o que permite a construção de estrias fora da biblioteca gráfica.
Além disso, foi adicionado um algoritmo para renderizar spline fechado.
Como resultado, a classe CCanvas tem agora dois novos métodos públicos.
Estes métodos permitem desenhar estrias em um determinado estilo e com uma determinada espessura.
Como as curvas de Bezier descrevem círculos e elipses de forma bastante precisa, não há necessidade óbvia de aumentar a classe CCanvas com novos métodos para tornar estes primitivos com uma determinada espessura.
O exemplo de aproximação de elipse por curvas Bézier baseadas no método PolygoneSmooth:
Resultado:
Outro passo possível para a versatilidade da biblioteca de gráficos: um modo de desenho de curvas personalizado CURVE_CUSTOM.
Este modo eliminará a necessidade de herdar a classe CGraphic e sobrecarregar os métodos de plotagem a fim de traçar uma curva diferente do que as ferramentas padrão da biblioteca permitem.
Para implementar este modo CURVE_CUSTOM novas propriedades serão adicionadas à classe CCurve.
Ela se baseia em um novo ponteiro para a função PlotFucntion.
Esta abordagem abre novas possibilidades para o desenho de parcelas.
Vamos implementar o desenho de candelabros na biblioteca CGraphics como exemplo:
1. Vamos criar uma classe de contêineres na qual todos os dados de uma única vela serão armazenados.
Como a classe CCandle é descendente da classe CObject, todos os castiçais que queremos desenhar, podemos escrevê-los sequencialmente no objeto da classe CArrayObj. Esta matriz entrará em nosso método de desenho personalizado como o parâmetro cbdata. Como resultado, o método de desenho do castiçal será o seguinte.
3. Para simplificar, todos os castiçais serão gerados de forma aleatória. E assim geramos seqüencialmente 10 castiçais e preenchemos o objeto da classe CArrayObj com eles. Depois criamos o objeto CGraphics e adicionamos uma curva a ele, enquanto especificamos que ele será desenhado usando nossa função PlotCandles. Também precisamos mudar os valores máximos e mínimos do eixo y, para que nossas velas sejam totalmente visíveis.
Como resultado, obtemos o seguinte gráfico:
@Roman Konopelko
há um pequeno erro na função CGraphic::SetDefaultParameters
As cores devem ser inicializadas com a opacidade levada em conta.
@Roman Konopelko
há um pequeno erro na função CGraphic::SetDefaultParameters
As cores devem ser inicializadas com a opacidade levada em conta.
Este exemplo causou o congelamento do computador. O que fiz: depois de colocar o indicador no gráfico no editor, joguei com diferentes combinações de linhas 87 e 88 (quando uma de cada vez, quando juntas)
Repetiu a conquista duas vezes. Eu não registrei a seqüência de ações. A terceira vez é trivial, tenho medo de verificar.
Adicionado: construir 1607 x64
Este exemplo causou o congelamento do computador. O que fiz: depois de colocar o indicador no gráfico no editor, joguei com diferentes combinações de linhas 87 e 88 (quando uma de cada vez, quando juntas)
Repetiu a conquista duas vezes. Eu não registrei a seqüência de ações. A terceira vez é trivial, tenho medo de verificar.
Adicionado: construir 1607 x64
Repetimos o recorde hoje - computadores mortos pendurados, conseguiram ver o consumo de RAM aumentar de 2GB para 5,5GB. Parece ter conseguido fechar o cronograma, mas o computador está pendurado há cinco minutos.
Desta vez coloquei um limite para o tamanho da matriz - não mais de 300 elementos. Como você pode ver, isso não ajudou 🤔
o que diz o debug?
o que diz o debug?
Jbug não entendeu, eu fiz isto: pairou um indicador e não comentou/comentou uma ou duas linhas e compilou. Acabou escrevendo a partir de um tablet, o laptop saiu.
O percevejo não conseguiu, eu fiz isto: passei o mouse sobre o indicador e comentei/comentei uma ou duas linhas e compilei. Acabou escrevendo a partir de um tablet, o laptop saiu.
Assim, o laptop depois de um reinício duro voltou à vida, mas não quero conduzir mais experiências destrutivas - há vários Expert Advisors rodando no laptop, então não há desejo de pegar um congelamento por uma hora inteira.