Il mio approccio. Il nucleo è il motore. - pagina 177

 
Реter Konow:

Ho bisogno di sviluppare una soluzione. La mia finestra consiste in un insieme di oggetti MT - tele. Le loro immagini devono essere ridotte prima individualmente e poi combinate in una sola. Abbiamo bisogno di un tale algoritmo. Cioè, diciamo, individualmente, ma per combinare le immagini ridotte, non ancora.

Calcolo del cambiamento delle coordinate relative degli oggetti. Hanno un punto di partenza. X e Y. Ricalcolali rispetto alla dimensione totale in larghezza e altezza della tela totale - finestra.

 
Artyom Trishkin:

Calcolo del cambiamento delle coordinate relative degli oggetti. Hanno un punto di partenza. X e Y. Ricalcolali rispetto alla dimensione totale in larghezza e altezza del kanvas totale - finestra.

Ho capito l'idea. Farò un tentativo se Nikolai dice di no. Grazie.

 
Реter Konow:

Ho bisogno di sviluppare una soluzione. La mia finestra consiste in un insieme di oggetti MT - tele. Le loro immagini devono essere ridotte prima individualmente e poi combinate in una sola. Abbiamo bisogno di un tale algoritmo. Cioè, diciamo, individualmente, ma per combinare le immagini ridotte, non ancora.

Prima di tutto, ovviamente, deve essere fatto, cioè deve avere un aspetto coerente. Anche ai vecchi tempi si diceva - stop, far uscire ... Ma non importa, il treno non si fermerà ;-) consideriamo che questa è la versione dell'autore eterno ...

Visto che stiamo ballando con C#, guardate OpenGL per essere "avanti nel tempo". E disegnare con esso su "tela" (ma in posti decenti non si chiama così, è il contesto). Sarà follemente veloce e potrete sovrapporre, scalare, ruotare, torcere come volete.

 
Mi dispiace, passo.
Il mio punto di conforto è che io stabilisco i miei compiti e li porto a termine da solo, e non stabilisco i compiti di nessun altro o porto a termine i compiti di nessun altro.

 
Artyom Trishkin:

Calcolo del cambiamento delle coordinate relative dell'oggetto. Hanno un punto di partenza. X e Y. Ricalcolateli rispetto alla larghezza e all'altezza complessive della tela - finestra.

Questo metodo di scalatura vettoriale sarà visivamente molto inferiore alla scalatura raster. E il testo? La dimensione del carattere "salterà" sproporzionatamente
La scalatura vettoriale sarebbe accettabile se le coordinate delle forme potessero essere impostate su valori frazionari (double) piuttosto che interi (int). Ma questo richiederebbe una nuova libreria Canvas avanzata con anti-aliasing.
 
Maxim Kuznetsov:

Prima di tutto, ovviamente, deve essere fatto. Voglio dire, deve avere un aspetto un po' coerente. La prima cosa da fare è renderlo un po' più olistico... È come si diceva una volta - fermati, fallo uscire... ma dai, il treno non si fermerà mai ;-) diciamo che è la versione dell'autore eterno...

Dato che stiamo ballando con C#, guardate OpenGL per essere "avanti nel tempo". E disegnare con esso su "tela" (ma in posti decenti non si chiama così, è il contesto). Sarà follemente veloce e potrete sovrapporre, scalare, ruotare, torcere come volete.

Se scrivi per te stesso, certo. Ma tutta la questione del parsing è nel mercato.
Avete lavorato con OpenGL o DirectX? Usano le risorse della scheda video?
ZS È una domanda stupida, però. Certo che lo fanno.

Non riesco a capire perché gli sviluppatori si sono avvitati su OpenCL e non su OpenGL? Probabilmente perché era più facile da fare.

SZY Ho letto di OpenCL. Ho letto di OpenCL. Questa tecnologia è più orientata al calcolo e questo spiega perché la scelta non è stata a favore di OpenGL.

 
Peter, sarebbe bello se tu imparassi OpenCL per la tua GUI. Se non sono confuso, funzionerà per il Mercato. È sufficiente che gli utenti abbiano installato il kernel OpenCL e che le loro schede video lo supportino, ovviamente.
Perché è possibile da molto tempo, ma non abbiamo ancora visto nessuna attività in questa direzione.

 
Nikolai Semko:
Questo metodo di scalatura vettoriale sarebbe visivamente molto inferiore alla scalatura raster. E il testo? La dimensione dei caratteri sarà sproporzionatamente "nervosa".
La scalatura vettoriale sarebbe accettabile se le coordinate delle forme potessero essere impostate su valori frazionari (double) piuttosto che interi (int). Ma questo richiederebbe una nuova libreria Canvas avanzata con anti-aliasing.

La prima cosa che mi è venuta in mente. Probabilmente influenzato dalla mia lunga esperienza con la grafica vettoriale in 3D Studio MAX - sono abituato a pensare in questo modo. Sì, è tutto in dubles ovviamente, e a proposito, vince molto visivamente sul ridimensionamento raster in photoshop.

 
Nikolai Semko:
Questo metodo di scalatura vettoriale sarebbe visivamente molto inferiore alla scalatura raster. E il testo? La dimensione dei caratteri sarà sproporzionatamente "nervosa".
La scalatura vettoriale sarebbe accettabile se le coordinate delle forme potessero essere impostate su valori frazionari (double) piuttosto che interi (int). Ma questo richiederebbe una nuova libreria Canvas avanzata con anti-aliasing.

Ed è qui che mi è venuto in mente: prendere un'immagine raster della forma della finestra richiesta, e poi scalarla come un singolo oggetto raster.

 
Artyom Trishkin:

Ed è qui che mi è venuto in mente: prendere una bitmap della forma della finestra richiesta e poi scalarla come un singolo oggetto bitmap.

Cos'altro potrebbe essere? Credo che sia quello che voleva Peter.

Ecco una funzione pronta all'uso per scalare un'immagine memorizzata in un array BMP[] con dimensioniwidth_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();
  }
File:
CImage.mqh  12 kb