Mi enfoque. El núcleo es el motor. - página 177

 
Реter Konow:

Necesito desarrollar una solución. Mi escaparate está formado por un conjunto de objetos MT, lienzos. Sus imágenes deben reducirse primero individualmente y luego combinarse en una sola. Necesito un algoritmo así. Es decir, digamos que individualmente, pero para combinar las imágenes reducidas, todavía no.

Calcular el cambio de coordenadas relativas de los objetos. Tienen un punto de partida. X e Y. Recalcularlos en relación con el tamaño total en anchura y altura del lienzo total - ventana.

 
Artyom Trishkin:

Calcular el cambio de las coordenadas relativas de los objetos. Tienen un punto de partida. X e Y. Recalcularlos en relación con la anchura y la altura total del kanvas - ventana.

Entiendo la idea. Lo intentaré si Nikolai dice que no. Gracias.

 
Реter Konow:

Necesito desarrollar una solución. Mi escaparate está formado por un conjunto de objetos MT, lienzos. Sus imágenes deben reducirse primero individualmente y luego combinarse en una sola. Necesitamos un algoritmo así. Es decir, digamos que individualmente, pero para combinar las imágenes reducidas, todavía no.

En primer lugar, por supuesto, tiene que estar hecho. Es decir, tiene que tener un aspecto un poco coherente. Incluso en los viejos tiempos se decía - para, deja salir ... Pero no importa, el tren no se detendrá ;-) consideremos que esta es la versión del autor eterno ...

Ya que estamos bailando con C#, mira a OpenGL para estar "por delante del planeta". Y dibujar con él en "lienzo" (pero en lugares decentes no se llama así, es contexto). Será muy rápido y podrás superponer, escalar, rotar y girar a tu gusto.

 
Lo siento, paso.
Mi punto de confort es que yo mismo establezco mis propias tareas y las cumplo, y no establezco las tareas de nadie ni cumplo las tareas de nadie.

 
Artyom Trishkin:

Calcular el cambio de las coordenadas relativas del objeto. Tienen un punto de partida. X e Y. Recalcularlos en relación con la anchura y la altura del lienzo general - ventana.

Este método de escalado vectorial será muy inferior visualmente al escalado rasterizado. ¿Y qué pasa con el texto? El tamaño de la letra "saltará" desproporcionadamente
El escalado vectorial sería aceptable si las coordenadas de las formas pudieran establecerse en valores fraccionarios (dobles) en lugar de enteros (int). Pero eso requeriría una nueva biblioteca avanzada de Canvas con antialiasing.
 
Maxim Kuznetsov:

En primer lugar, por supuesto, tiene que estar hecho. Es decir, tiene que tener un aspecto un poco coherente. Es como decían en su día: para, déjalo salir... pero vamos, que el tren no parará nunca ;-) digamos que es la versión del eterno autor...

Ya que estamos bailando con C#, mira a OpenGL para estar "por delante del planeta". Y dibujar con ella en "lienzo" (pero en lugares decentes no se llama así, es contexto). Será muy rápido y podrás superponer, escalar, rotar y girar a tu gusto.

Si escribes para ti, claro. Pero todo el tema del análisis está en el mercado.
¿Has trabajado con OpenGL o DirectX? ¿Utilizan recursos de la tarjeta de vídeo?
ZS Sin embargo, es una pregunta tonta. Por supuesto que sí.

No puedo entender por qué los desarrolladores se equivocaron con OpenCL y no con OpenGL. Probablemente porque era más fácil de hacer.

SZY he leído sobre OpenCL. He leído sobre OpenCL. Esta tecnología está más orientada a la computación y eso explica que la elección no haya sido a favor de OpenGL.

 
Peter, sería genial que aprendieras OpenCL para tu GUI. Si no me confundo, funcionará para el Mercado. Sólo es necesario que los usuarios tengan instalado el kernel OpenCL y que sus tarjetas de vídeo lo soporten, por supuesto.
Porque es posible desde hace mucho tiempo, pero aún no hemos visto ninguna actividad en este sentido.

 
Nikolai Semko:
Este método de escalado vectorial sería visualmente muy inferior al escalado rasterizado. ¿Y qué pasa con el texto? El tamaño de la fuente será desproporcionadamente "saltarín".
El escalado vectorial sería aceptable si las coordenadas de las formas pudieran establecerse en valores fraccionarios (dobles) en lugar de enteros (int). Pero eso requeriría una nueva biblioteca avanzada de Canvas con antialiasing.

Lo primero que me vino a la mente. Probablemente influido por mi larga experiencia con gráficos vectoriales en 3D Studio MAX, estoy acostumbrado a pensar de esa manera. Sí, está todo en dubles por supuesto, y por cierto, gana mucho visualmente al escalado de trama en photoshop.

 
Nikolai Semko:
Este método de escalado vectorial sería visualmente muy inferior al escalado rasterizado. ¿Y qué pasa con el texto? El tamaño de la fuente será desproporcionadamente "saltarín".
El escalado vectorial sería aceptable si las coordenadas de las formas pudieran establecerse en valores fraccionarios (dobles) en lugar de enteros (int). Pero eso requeriría una nueva biblioteca avanzada de Canvas con antialiasing.

Y aquí es donde se me ocurrió: tomar una imagen rasterizada de la forma de ventana requerida, y luego escalarla como un único objeto rasterizado.

 
Artyom Trishkin:

Y aquí es donde se me ocurrió: tomar un mapa de bits de la forma de ventana requerida y luego escalarlo como un solo objeto de mapa de bits.

¿Qué otra cosa podría ser? Creo que eso es lo que quería Peter.

Esta es una función lista para usar para escalar una imagen almacenada en una matriz BMP[] con el tamañowidth_bmp xheight_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();
  }
Archivos adjuntos:
CImage.mqh  12 kb
Razón de la queja: