прямоугольник, треугольник, эллипс. заливка цветом при наложении объектов друг на друга. - страница 2

 
Комбинатор:

Вы вначале реализуйте прототип, рабочий и функциональный и быстрый, который вас устраивает

Вот его выкидывайте на обсуждение, и если он реально будет удобным, будет что обсуждать в СД.

Или используйте канвас и рисуйте что хотите и как хотите.


1 вот честно не совсем понимаю какой я могу сделать прототип( идея простая и заключается в следующем, сделать возможность, в графических фигурах вместо картинок использовать подложку в виде BMP файла, что бы он растягивался автоматически на всю площадь фигуры,
(по принципу как он устанавливается в объекте Bitmap)
2 скажите пожалуйста, в начале этой ветки есть картинка , если я буду рисовать фигуры в Canvas при наложении друг на друга я получу желаемый результат? мне нужно в тех местах. где вопросы на картинке. выше в этой ветке. иметь красный цвет (такой же как цвет фигур)
если да. то я без проблем. это будет делать через Canvas

 
Pavel Verveyko:

1 вот честно не совсем понимаю какой я могу сделать прототип( идея простая и заключается в следующем, сделать возможность, в графических фигурах вместо картинок использовать подложку в виде BMP файла, что бы он растягивался автоматически на всю площадь фигуры,
(по принципу как он устанавливается в объекте Bitmap)
2 скажите пожалуйста, в начале этой ветки есть картинка , если я буду рисовать фигуры в Canvas при наложении друг на друга я получу желаемый результат? мне нужно в тех местах. где вопросы на картинке. выше в этой ветке. иметь красный цвет (такой же как цвет фигур)
если да. то я без проблем. это будет делать через Canvas

//+------------------------------------------------------------------+
//|                                                 CanvasFigura.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs  //Выводить окно со свойствами перед запуском скрипта

#include <Canvas\Canvas.mqh>

input bool top=false; // рисовать под графиком?
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Способ обработки цвета
input uchar transp=255; // прозрачность от 0 до 255. 0 - полностью прозрачный, 255 - непрозрачный

void OnStart()
  {
   ChartSetInteger(0,CHART_FOREGROUND,top);
   int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину окна
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна
   uint ColorScreen=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND,0); // получаем цвет фона
   CCanvas canvas;
   if(!canvas.CreateBitmapLabel("SampleCanvas",0,0,Width,Height,format)) Print("Error creating canvas: ",GetLastError());
   canvas.Erase(ColorScreen);
   canvas.FillCircle(Width/4,Height/2,Height/3,ColorToARGB(clrRed,transp));
   canvas.FillRectangle(3*Width/8,2*Height/8,5*Width/8,6*Height/8,ColorToARGB(clrRed,transp));
   canvas.FillTriangle(11*Width/20,14*Height/20,17*Width/20,14*Height/20,14*Width/20,5*Height/20,ColorToARGB(clrRed,transp));
   canvas.Update();
   Sleep(3000);
// меняем цвета и прозрачность. Прозрачность работает только при format=COLOR_FORMAT_ARGB_NORMALIZE
   uchar r=0,g=80,b=160,tr=200;
   while(!IsStopped())
     {
      canvas.Erase(ColorScreen);
      uint clr=(tr<<24)|(r<<16)|(g<<8)|b;
      canvas.FillCircle(Width/4,Height/2,Height/3,(tr<<24)|(r<<16)|(g<<8)|b);
      canvas.FillRectangle(3*Width/8,2*Height/8,5*Width/8,6*Height/8,(tr<<24)|(g<<16)|(b<<8)|r);
      canvas.FillTriangle(11*Width/20,14*Height/20,17*Width/20,14*Height/20,14*Width/20,5*Height/20,(tr<<24)|(b<<16)|(r<<8)|g);
      canvas.Update();
      tr++;
      g+=2;
      b+=3;
      r+=4;
      Sleep(33);
     }
   canvas.Destroy();
  } 
//+------------------------------------------------------------------+
 
Nikolai Semko:

большое спасибо) скажите пожалуйста,
 изменение масштаба, размер фигур и точки их привязок не связаны?

 потому как фагуры только по пикселям строятся?

(стандартные фигуры строятся по координатам цены и времени)

c помощью BitmapLab можно и без Canvas нарисовать просто фигуры привязаны к графику а эти к монитору(

ещё раз спасибо, вечером попробую покрутить canvas вдруг чё и выйдет
 
Pavel Verveyko:

большое спасибо) скажите пожалуйста,
 изменение масштаба, размер фигур и точки их привязок не связаны?

 потому как фагуры только по пикселям строятся?

(стандартные фигуры строятся по координатам цены и времени)

c помощью BitmapLab можно и без Canvas нарисовать просто фигуры привязаны к графику а эти к монитору(

ещё раз спасибо, вечером попробую покрутить canvas вдруг чё и выйдет

Можно привязывать к пикселям экрана, а можно и ко времени. Для этого существуют различные способы привязки объектов. В классе CCanvas это CreateCreateBitmapCreateBitmapLabel.
Изучайте первоисточники и экспериментируйте. А то будет как в известном мультике:))


 
Nikolai Semko:

Можно привязывать к пикселям экрана, а можно и ко времени. Для этого существуют различные способы привязки объектов. В классе CCanvas это CreateCreateBitmapCreateBitmapLabel.
Изучайте первоисточники и экспериментируйте. А то будет как в известном мультике:))


сделать и съесть я могу сам.. мне бы понять будет оно работать как мне нужно или нет) (есть ли такая техническая возможность)
 

а Bitmap буде потом автоматически изменять размер при изменении масштаба графика?
там ведь привязка цена и время а две другие точки всё равно это пиксели..

или нужно будет отдельно под каждый масштаб делать размер фигуры?

 
Pavel Verveyko:
сделать и съесть я могу сам.. мне бы понять будет оно работать как мне нужно или нет) (есть ли такая техническая возможность)
 

а Bitmap буде потом автоматически изменять размер при изменении масштаба графика?
там ведь привязка цена и время а две другие точки всё равно это пиксели..

или нужно будет отдельно под каждый масштаб делать размер фигуры?


Нет, при использовании CreateBitmap для привязки к графику, привязываться будет только начало (левый верхний угол) канваса, и при масштабировании размер канваса меняться не будет в текущей реализации класса CCanvas. Но вам никто не мешает считывать изменение масштаба графика через событие CHARTEVENT_CHART_CHANGE и реализовать синхронное изменение маcштаба самого канваса или масштаба объектов внутри него. Класс CCanvas не догма, а лишь пример реализации пользовательской графики, причем далеко не самый лучший, и вы можете создать свой аналогичный класс, свою систему масштабируемых координат и т.д.  Павел, вы же опытный программист судя по количеству ваших продуктов. К чему тогда эти странные вопросы? Изучите класс CCanvas в файле: "..\MQL5\Include\Canvas\Canvas.mqh" и станет всё ясно. Лично я использую из этого класса только создание самого канваса и массив его точек m_pixels[], который имеет размерность m_width*m_height, формируя свои собственные функции.

 
Nikolai Semko:

Нет, при использовании CreateBitmap для привязки к графику, привязываться будет только начало (левый верхний угол) канваса, и при масштабировании размер канваса меняться не будет в текущей реализации класса CCanvas. Но вам никто не мешает считывать изменение масштаба графика через событие CHARTEVENT_CHART_CHANGE и реализовать синхронное изменение маcштаба самого канваса или масштаба объектов внутри него. Класс CCanvas не догма, а лишь пример реализации пользовательской графики, причем далеко не самый лучший, и вы можете создать свой аналогичный класс, свою систему масштабируемых координат и т.д.  Павел, вы же опытный программист судя по количеству ваших продуктов. К чему тогда эти странные вопросы? Изучите класс CCanvas в файле: "..\MQL5\Include\Canvas\Canvas.mqh" и станет всё ясно. Лично я использую из этого класса только создание самого канваса и массив его точек m_pixels[], который имеет размерность m_width*m_height, формируя свои собственные функции.


спасибо за ответ, думал не ответите)

изменение масштаба меня не пугает, я делал тестер ручной торговли, там это вынужденная мера,
а вот когда у меня 1000 фигур, все разной высоты и ширины; перестраивать их по масштабу( мне кажется не приемлемым с точки зрения ресурсозатратности тем более что это индикатор(((
 
вопросы к тому, что я не смогу с помощью канваса решить свой вопрос а мне все советуют этот канвас. 
по сути, что ООП, что просто функции, они все делают одно и то же..

мне нужно либо, что бы объект прямоугольник заполнялся bmp файлом, либо BitMap ширину и высоту высчитывал не на основе пикселей а на основе цены и времени то есть правый край тоже должен быть привязан к цене и времени изначально без перестройки по масштабу..
я вот давно заметил язык MQL простой но вот пути решений для достижения определённых результатов иногда слишком длинные 

попробую при свободном времени перестраивать размер фигур построенные в канвасе как Bitmap за масштабом , но думаю придётся отказаться от идем залитых фигур. и пользоваться фигурами 14 летней давности)
и если рисовать Bitmapы и менять их под масштаб то и canvas не нужен(

 
Pavel Verveyko:


мне нужно либо, что бы объект прямоугольник заполнялся bmp файлом, либо BitMap ширину и высоту высчитывал не на основе пикселей а на основе цены и времени то есть правый край тоже должен быть привязан к цене и времени изначально без перестройки по масштабу..

Так ведь другого варианта не существует, как только через создание канвасa посредством CreateBitmap. Или мы просто путаемся в определениях. Канвас это и есть BitMap! Просто в классе CCanvas и создаётся этот BitMap, и с объектом класса удобнее работать.
Или вы не дружите с ООП и просто его боитесь? Тогда пора подружиться. :))
P.S. не понимаю куда делось моё предыдущее сообщение. Лень писать заново.

 
Nikolai Semko:
Так ведь другого варианта не существует, как только через создание канвасa посредством CreateBitmap. Или мы просто путаемся в определениях. Канвас это и есть BitMap! Просто в классе CCanvas и создаётся этот BitMap, и с объектом класса удобнее работать.
Или вы не дружите с ООП и просто его боитесь? Тогда пора подружиться. :))
P.S. не понимаю куда делось моё предыдущее сообщение. Лень писать заново.


ага, только сейчас обратил внимание) что графические фигуры в другом классе а здесь только Bitmap. в любом случае под мои потребности и в контексте этой задачи ни то не другое не подходит( а жаль
 
с ООП дружу , но использую его исключительно в очень больших размерах кода, там где без него нельзя.. в мелких масштабах неООП как то логику алгоритмов удобнее думать .. может правда это просто привычка)

жаль что сообщение пропало , наверно что-то толковое было.. (у меня есть золотое правило, прежде чем нажать : отправить, обновить; нужно нажать ctrl+a и ctrl+c)

 
Pavel Verveyko:

ага, только сейчас обратил внимание) что графические фигуры в другом классе а здесь только Bitmap. в любом случае под мои потребности и в контексте этой задачи ни то не другое не подходит( а жаль
 
с ООП дружу , но использую его исключительно в очень больших размерах кода, там где без него нельзя.. в мелких масштабах неООП как то логику алгоритмов удобнее думать .. может правда это просто привычка)

жаль что сообщение пропало , наверно что-то толковое было.. (у меня есть золотое правило, прежде чем нажать : отправить, обновить; нужно нажать ctrl+a и ctrl+c)


Из ваших слов, Павел, я пока могу сделать только один вывод. Вы не понимаете, что такое BitMap и суть класса CCanvas. Canvas в переводе с английского - холст. Т.е. вы формируете в пределах своего окна холст, на котором можете нарисовать что угодно, и при этом можете даже выключить сам график, или этот график рисовать уже в канвасе. У вас есть доступ к любой точке, вы можете формировать любые фигуры с любой заливкой, в том числе градиентной. Даже, если задаться целью, вы можете с помощью канваса создать видео плеер в МТ, графический редактор сложности фотошопа, 3D игру, да хоть виртуальную ОС написать. А вы говорите - не подходит. Нет такой графической задачи, которой нельзя было бы решить в канвасе. Другое дело скорость. Но, я думаю, вы также недооцениваете скорость канваса. Тем более если у вас 1000 объектов, - только канвас, т.к. канвас это один объект, на котором можно нарисовать сколько угодно фигур, а не так как при использовании обычных встроенных в МТ5 фигур, которые представляет каждая из себя объект. А если бы оценивали быстродействие рисования, то поняли бы что формирование объекта достаточно ресурсоёмкое дело. Прикреплю один пример - скрипт в виде исполняемого файла на МТ5 и можете оценить скорость карваса. В примере рисуются сглаженные закрашенные круги в случайном порядке и случайного цвета и плавно меняют свой размер. Попробуйте при запуске этого скрипта, поставьте задержку между кадрами 0 миллисекунд и количество окружностей 1000. Вы даже задержки не увидите. Я увидел задержку между кадрами где то в 0.2-0.3 секунды при количестве окружностей  10 000. Т.е. в каждом кадре прорисовываются все 10000 окружностей с радиусами от 20 до 200 (по умолчанию) и накладываются друг на друга, причем формирование окружности и ее закрашивание происходит попиксельно. 

Файлы:
Причина обращения: