Mein Ansatz. Der Kern ist der Motor. - Seite 177

 
Реter Konow:

Ich muss eine Lösung entwickeln. Mein Fenster besteht aus einer Reihe von MT-Objekten - Leinwänden. Ihre Bilder müssen zunächst einzeln verkleinert und dann zu einem Bild kombiniert werden. Wir brauchen einen solchen Algorithmus. Das heißt, sagen wir, einzeln, aber um die verkleinerten Bilder zu kombinieren, noch nicht.

Berechnung der Änderung der relativen Koordinaten der Objekte. Sie haben eine Ausgangsbasis. X und Y. Berechnen Sie sie relativ zur Gesamtgröße in Breite und Höhe des gesamten Canvas-Fensters neu.

 
Artyom Trishkin:

Berechnung der Änderung der relativen Koordinaten der Objekte. Sie haben eine Ausgangsbasis. X und Y. Berechnen Sie sie relativ zur Gesamtbreite und -höhe des gesamten Kanvas-Fensters neu.

Ich verstehe die Idee. Ich werde es versuchen, wenn Nikolai nein sagt. Ich danke Ihnen.

 
Реter Konow:

Ich muss eine Lösung entwickeln. Mein Fenster besteht aus einer Reihe von MT-Objekten - Leinwänden. Ihre Bilder müssen zunächst einzeln verkleinert und dann zu einem Bild kombiniert werden. Wir brauchen einen solchen Algorithmus. Das heißt, sagen wir, einzeln, aber um die verkleinerten Bilder zu kombinieren, noch nicht.

Zunächst einmal muss es natürlich gemacht sein, d. h. es muss ein bisschen kohärent aussehen. Schon früher hieß es - Halt, aussteigen lassen ... Aber egal, der Zug hält nicht an ;-) glauben wir, dass dies die Version des ewigen Autors ist ...

Da wir mit C# tanzen, schauen Sie sich OpenGL an, um "dem Planeten voraus zu sein". Und zeichne damit auf "Leinwand" (aber anständigerweise heißt es nicht so, sondern Kontext). Das geht wahnsinnig schnell, und Sie können die Bilder nach Belieben überlagern, skalieren, drehen und verdrehen.

 
Tut mir leid, ich verzichte.
Mein Trost ist, dass ich mir meine eigenen Aufgaben stelle und sie selbst erledige, und ich stelle niemandem andere Aufgaben und erledige auch nicht die Aufgaben von anderen.

 
Artyom Trishkin:

Berechnung der Änderung der relativen Objektkoordinaten. Sie haben eine Ausgangsbasis. X und Y. Berechnen Sie sie relativ zur Gesamtbreite und -höhe des gesamten Canvas-Fensters neu.

Diese Methode der Vektorskalierung ist visuell sehr viel schlechter als die Rasterskalierung. Und was ist mit Text? Die Schriftgröße "springt" überproportional
Die Vektorskalierung wäre akzeptabel, wenn die Koordinaten der Formen auf gebrochene (double) statt auf ganzzahlige (int) Werte gesetzt werden könnten. Aber das würde eine neue, fortschrittliche Canvas-Bibliothek mit Anti-Aliasing erfordern.
 
Maxim Kuznetsov:

Zuallererst muss es natürlich gemacht werden. Ich meine, es muss ein bisschen kohärent aussehen. Das erste, was Sie tun müssen, ist, es ein wenig ganzheitlicher aussehen zu lassen... Es ist so, wie man früher zu sagen pflegte - Stopp, lass es raus... aber komm schon, der Zug wird niemals anhalten ;-) sagen wir einfach, es ist die Version des ewigen Autors...

Da wir mit C# tanzen, schauen Sie sich OpenGL an, um "dem Planeten voraus zu sein". Und zeichne damit auf "Leinwand" (aber anständigerweise heißt es nicht so, sondern Kontext). Das geht wahnsinnig schnell, und Sie können die Bilder nach Belieben überlagern, skalieren, drehen und verdrehen.

Wenn Sie für sich selbst schreiben, sicher. Aber die ganze Sache mit dem Parsing liegt auf dem Markt.
Haben Sie mit OpenGL oder DirectX gearbeitet? Verwenden sie die Ressourcen der Grafikkarte?
ZS Das ist allerdings eine dumme Frage. Natürlich tun sie das.

Ich kann nicht verstehen, warum die Entwickler auf OpenCL und nicht auf OpenGL gesetzt haben? Wahrscheinlich, weil es einfacher zu machen war.

SZY Ich habe über OpenCL gelesen. Ich habe über OpenCL gelesen. Diese Technologie ist mehr auf Berechnungen ausgerichtet und das erklärt, warum die Wahl nicht auf OpenGL gefallen ist.

 
Peter, es wäre toll, wenn du OpenCL für deine GUI lernen würdest. Wenn ich mich nicht täusche, wird es auf dem Markt funktionieren. Natürlich müssen die Benutzer nur den OpenCL-Kernel installieren und ihre Grafikkarten müssen ihn unterstützen.
Denn es ist schon seit langem möglich, aber bisher gab es keine Aktivitäten in dieser Richtung.

 
Nikolai Semko:
Diese Methode der Vektorskalierung wäre visuell sehr viel schlechter als die Rasterskalierung. Und was ist mit Text? Die Schriftgröße wird unverhältnismäßig "sprunghaft" sein.
Die Vektorskalierung wäre akzeptabel, wenn die Koordinaten der Formen auf gebrochene (double) statt auf ganzzahlige (int) Werte gesetzt werden könnten. Aber das würde eine neue, fortschrittliche Canvas-Bibliothek mit Anti-Aliasing erfordern.

Das erste, was mir in den Sinn kam. Wahrscheinlich ist das auf meine langjährige Erfahrung mit Vektorgrafiken in 3D Studio MAX zurückzuführen - ich bin es gewohnt, auf diese Weise zu denken. Ja, es ist natürlich alles in Dubles, und übrigens, sehr viel visuell gewinnt über Raster-Skalierung in Photoshop.

 
Nikolai Semko:
Diese Methode der Vektorskalierung wäre visuell sehr viel schlechter als die Rasterskalierung. Und was ist mit Text? Die Schriftgröße wird unverhältnismäßig "sprunghaft" sein.
Die Vektorskalierung wäre akzeptabel, wenn die Koordinaten der Formen auf gebrochene (double) statt auf ganzzahlige (int) Werte gesetzt werden könnten. Aber das würde eine neue, fortschrittliche Canvas-Bibliothek mit Anti-Aliasing erfordern.

Und hier kam mir die Idee: Nehmen Sie ein Rasterbild der gewünschten Fensterform und skalieren Sie es dann als einzelnes Rasterobjekt.

 
Artyom Trishkin:

Und hier kam mir die Idee: Nehmen Sie ein Bitmap der gewünschten Fensterform und skalieren Sie es als ein einziges Bitmap-Objekt.

Was könnte es sonst sein? Ich glaube, das ist es, was Peter wollte.

Hier ist eine gebrauchsfertige Funktion zum Skalieren eines in einem BMP[]-Array gespeicherten Bildes mit der Größewidth_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();
  }
Dateien:
CImage.mqh  12 kb