Мой подход. Ядро - Движок. - страница 177

 
Реter Konow:

Нужно развить решение. Мое окно состоит из комплекса МТ-объектов - канвасов. Их изображения нужно уменьшить сначала по отдельности, а потом совместить в одно. Нужен такой алгоритм. То есть, по отдельности допустим есть, а чтобы совместить уменьшенные картинки, еще нет.

Расчёт изменения относительных координат объектов. У них же есть отправная точка. По X и по Y. Пересчитайте их относительно общего размера по ширине и высоте общего канваса - окна.

 
Artyom Trishkin:

Расчёт изменения относительных координат объектов. У них же есть отправная точка. По X и по Y. Пересчитайте их относительно общего размера по ширине и высоте общего канваса - окна.

Понял идею. Попробую, если Николай откажется. Спасибо.

 
Реter Konow:

Нужно развить решение. Мое окно состоит из комплекса МТ-объектов - канвасов. Их изображения нужно уменьшить сначала по отдельности, а потом совместить в одно. Нужен такой алгоритм. То есть, по отдельности допустим есть, а чтобы совместить уменьшенные картинки, еще нет.

во первых конечно его надо сделать. то есть чтобы оно имело немного целостный вид. Ещё в давние времена говорили - стоп, выпускайся..Ну да ладно, паровоз неостановим ;-) будем считать что это вечная авторская версия..

раз уж пошла такая пляска с C#, то чтобы быть "впереди планеты всей" - посмотрите на OpenGL. И рисуйте им на "канвасе" (правда в приличных местах это так не называется, это контекст). Это будет сумасшедше быстро и можете накладывать, масштабировать, вращать, извращать как угодно.   

 
Прости, я пасс.
Моя точка комфорта, когда я сам ставлю перед собой задачи и сам их выполняю, и не ставлю не перед кем задач, и ничьих задач не выполняю.

 
Artyom Trishkin:

Расчёт изменения относительных координат объектов. У них же есть отправная точка. По X и по Y. Пересчитайте их относительно общего размера по ширине и высоте общего канваса - окна.

Такой метод векторного масштабирования будет очень сильно визуально проигрывать растровому масштабированию.  И как быть с текстом? Размер шрифта будет непропорционально "прыгать"
Векторное масштабирование было бы приемлемо, если бы координаты фигур можно было задавать не целыми(int) значениями, а дробными (double). Но для этого нужна новая библиотека продвинутого Canvas со сглаживанием.
 
Maxim Kuznetsov:

во первых конечно его надо сделать. то есть чтобы оно имело немного целостный вид. Ещё в давние времена говорили - стоп, выпускайся..Ну да ладно, паровоз неостановим ;-) будем считать что это вечная авторская версия..

раз уж пошла такая пляска с C#, то чтобы быть "впереди планеты всей" - посмотрите на OpenGL. И рисуйте им на "канвасе" (правда в приличных местах это так не называется, это контекст). Это будет сумасшедше быстро и можете накладывать, масштабировать, вращать, извращать как угодно.   

Если писать для себя, то конечно. Но вся петрушка в маркете.
А Вы работали с OpenGL или с DirectX? Они ресурсы видеокарты используют?
ЗЫ Хотя глупый вопрос. Конечно да.

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

ЗЫЫ Почитал про OpenCL. Эта технология больше заточена под вычисления,  тогда понятно почему выбор был сделан не в пользу OpenGL.

 
Петр, да тебе было бы круто освоить OpenCL для своего ГУИ. Если я ничего не путаю, то для маркета это прокатит. Только нужно, чтобы пользователи установили бы у себя ядро OpenCL , ну и, конечно, чтобы их видеокарта это поддерживала.
А то возможность такая есть уже давно,  но что-то активности в этом направлении пока не наблюдается.

 
Nikolai Semko:
Такой метод векторного масштабирования будет очень сильно визуально проигрывать растровому масштабированию.  И как быть с текстом? Размер шрифта будет непропорционально "прыгать"
Векторное масштабирование было бы приемлемо, если бы координаты фигур можно было задавать не целыми(int) значениями, а дробными (double). Но для этого нужна новая библиотека продвинутого Canvas со сглаживанием.

Первое, что пришло на ум. Наверное сказывается моя давнишняя работа с векторной графикой в 3D Studio MAX - привык мыслить так. Да, там всё в даблах конечно же, и, кстати, очень сильно визуально выигрывает перед растровым масштабированием в фотошопе.

 
Nikolai Semko:
Такой метод векторного масштабирования будет очень сильно визуально проигрывать растровому масштабированию.  И как быть с текстом? Размер шрифта будет непропорционально "прыгать"
Векторное масштабирование было бы приемлемо, если бы координаты фигур можно было задавать не целыми(int) значениями, а дробными (double). Но для этого нужна новая библиотека продвинутого Canvas со сглаживанием.

И вот тут мне пришло смс в голову: делаем растровый снимок требуемого окна-формы, и затем уже его масштабируем как один растровый объект.

 
Artyom Trishkin:

И вот тут мне пришло смс в голову: делаем растровый снимок требуемого окна-формы, и затем уже его масштабируем как один растровый объект.

Ну а как иначе? Я думаю, Петр так и хотел.

Вот уже готовая функция масштабирования растра, который находится в массиве  BMP[] размерностью width_bmp x height_bmp

void CImage::ResizeImage(double NewWidth)
  {
   if(NewWidth==0) NewWidth=1;
   double k=NewWidth/width_bmp; // меньше единицы
   double k2=k*k;
   double kk=width_bmp/NewWidth;  // больше единицы
   double w1=(double)width_bmp*k; int W=_ceil(w1);
   double h1=(double)height_bmp*k; int H=_ceil(h1);
   uint M[];
   int ArrSize=W*H;
   ArrayResize(M,ArrSize);
   int pos=0;
   double y0=0,x0,y1=kk,x1;
   for(int y=0; y<H; y++,y0=y1,y1+=kk)
     {
      x0=0; x1=kk;
      for(int x=0; x<W; x++,x0=x1,x1+=kk,pos++)
        {
         int xs=(int)x0;
         int xf=(int)x1;
         int ys=(int)y0;
         int yf=(int)y1;
         double r=0,g=0,b=0,p=0;
         int pos2=ys*(int)width_bmp+xs;
         for(int Y1=ys;Y1<=yf;Y1++,pos2+=(int)width_bmp)
           {
            double dx,dy;
            int pos1=pos2;
            if(Y1==ys) { dy=ys+1-y0; if(ys==yf) dy=dy-1+y1-yf;}
            else if(Y1==yf) dy=y1-yf;
            else dy=1;
            for(int X1=xs;X1<=xf;X1++,pos1++)
              {
               if(pos1<SizeArr)
                 {
                  if(BMP[pos1]!=0)
                    {
                     col.clr=BMP[pos1];
                     if(X1==xs) { dx=xs+1-x0; if(xs==xf) dx=dx-1+x1-xf;}
                     else if(X1==xf) dx=x1-xf;
                     else dx=1;
                     dx=dx*dy;
                     r+=(double)col.argb[2]*dx;
                     g+=(double)col.argb[1]*dx;
                     b+=(double)col.argb[0]*dx;
                     p+=(double)col.argb[3]*dx;
                    }
                 }
               else break;
              }
           }
         col.argb[0]=uchar(b*k2);
         col.argb[1]=uchar(g*k2);
         col.argb[2]=uchar(r*k2);
         col.argb[3]=uchar(p*k2);
         M[pos]=col.clr;
        }
     }
   C.Resize(W,H);
   ArraySwap(C.m_pixels,M);
   C.Update();
  }
Файлы:
CImage.mqh  12 kb
Причина обращения: