Mon approche. Le noyau est le moteur. - page 177

 
Реter Konow:

Je dois développer une solution. Ma fenêtre est constituée d'un ensemble d'objets MT - des toiles. Leurs images doivent d'abord être réduites individuellement, puis combinées en une seule. Nous avons besoin d'un tel algorithme. C'est-à-dire, disons, individuellement, mais pour combiner les images réduites, pas encore.

Calculer le changement des coordonnées relatives des objets. Ils ont un point de départ. X et Y. Recalculez-les par rapport à la taille totale en largeur et en hauteur de la toile - fenêtre totale.

 
Artyom Trishkin:

Calculer le changement des coordonnées relatives des objets. Ils ont un point de départ. X et Y. Les recalculer par rapport à la taille totale en largeur et en hauteur de la fenêtre totale du kanvas.

Je comprends l'idée. Je vais essayer si Nikolaï dit non. Merci.

 
Реter Konow:

Je dois développer une solution. Ma fenêtre est constituée d'un ensemble d'objets MT - des toiles. Leurs images doivent d'abord être réduites individuellement, puis combinées en une seule. Nous avons besoin d'un tel algorithme. C'est-à-dire, disons, individuellement, mais pour combiner les images réduites, pas encore.

Tout d'abord, bien sûr, il faut qu'il soit fabriqué. Je veux dire qu'il doit avoir un aspect un peu cohérent. Même dans l'ancien temps, on disait - arrêtez, laissez sortir ... Mais qu'importe, le train ne s'arrêtera pas ;-) considérons que c'est la version de l'auteur éternel ...

Puisque nous dansons avec C#, regardez OpenGL pour être "en avance sur la planète". Et dessiner avec elle sur une "toile" (mais dans les endroits décents, on ne l'appelle pas ainsi, c'est le contexte). Ce sera follement rapide et vous pourrez superposer, mettre à l'échelle, faire pivoter, tordre comme vous le souhaitez.

 
Désolé, je passe mon tour.
Ce qui me rassure, c'est que je fixe mes propres tâches et les accomplis moi-même, et que je ne fixe pas les tâches de quelqu'un d'autre ni n'accomplis celles de quelqu'un d'autre.

 
Artyom Trishkin:

Calcul de la modification des coordonnées relatives de l'objet. Ils ont un point de départ. X et Y. Recalculez-les par rapport à la largeur et à la hauteur globales de l'ensemble du canevas - fenêtre.

Cette méthode de mise à l'échelle vectorielle sera visuellement très inférieure à la mise à l'échelle matricielle. Et qu'en est-il du texte ? La taille de la police va "sauter" de manière disproportionnée.
La mise à l'échelle vectorielle serait acceptable si les coordonnées des formes pouvaient être définies comme des valeurs fractionnaires (doubles) plutôt que des valeurs entières (int). Mais cela nécessiterait une nouvelle bibliothèque Canvas avancée avec anticrénelage.
 
Maxim Kuznetsov:

Tout d'abord, bien sûr, il faut qu'il soit fabriqué. Je veux dire qu'il doit avoir un aspect un peu cohérent. La première chose à faire est de lui donner un aspect un peu plus holistique... C'est comme autrefois on disait : arrête, laisse sortir... mais allez, le train ne s'arrête pas ;-) disons que c'est la version de l'auteur éternel...

Puisque nous dansons avec C#, regardez OpenGL pour être "en avance sur la planète". Et dessiner avec elle sur une "toile" (mais dans les endroits décents, on ne l'appelle pas ainsi, c'est le contexte). Ce sera follement rapide et vous pourrez superposer, mettre à l'échelle, faire pivoter, tordre comme vous le souhaitez.

Si vous écrivez pour vous-même, bien sûr. Mais toute cette histoire d'analyse syntaxique est sur le marché.
Avez-vous travaillé avec OpenGL ou DirectX ? Utilisent-ils les ressources de la carte vidéo ?
ZS C'est une question idiote. Bien sûr qu'ils le font.

Je n'arrive pas à comprendre pourquoi les développeurs se sont plantés sur OpenCL et pas sur OpenGL ? Probablement parce que c'était plus facile à faire.

SZY Je me suis renseigné sur OpenCL. J'ai lu des informations sur OpenCL. Cette technologie est plus orientée vers le calcul et cela explique pourquoi le choix n'a pas été en faveur d'OpenGL.

 
Peter, ce serait cool pour toi d'apprendre OpenCL pour ton interface graphique. Si je ne suis pas confus, cela fonctionnera pour le marché. Il suffit que le noyau OpenCL soit installé par les utilisateurs et que leurs cartes vidéo le prennent en charge, bien sûr.
Parce que c'est possible depuis longtemps, mais nous n'avons pas encore vu d'activité dans ce sens.

 
Nikolai Semko:
Cette méthode de mise à l'échelle vectorielle serait visuellement très inférieure à la mise à l'échelle matricielle. Et qu'en est-il du texte ? La taille de la police sera disproportionnellement "saccadée".
La mise à l'échelle vectorielle serait acceptable si les coordonnées des formes pouvaient être définies comme des valeurs fractionnaires (doubles) plutôt que des valeurs entières (int). Mais cela nécessiterait une nouvelle bibliothèque Canvas avancée avec anticrénelage.

La première chose qui m'est venue à l'esprit. Probablement influencé par ma longue expérience des graphiques vectoriels dans 3D Studio MAX - j'ai l'habitude de penser de cette manière. Oui, tout est en dubles bien sûr, et d'ailleurs, c'est visuellement beaucoup plus efficace que la mise à l'échelle de trames dans photoshop.

 
Nikolai Semko:
Cette méthode de mise à l'échelle vectorielle serait visuellement très inférieure à la mise à l'échelle matricielle. Et qu'en est-il du texte ? La taille de la police sera disproportionnellement "saccadée".
La mise à l'échelle vectorielle serait acceptable si les coordonnées des formes pouvaient être définies comme des valeurs fractionnaires (doubles) plutôt que des valeurs entières (int). Mais cela nécessiterait une nouvelle bibliothèque Canvas avancée avec anticrénelage.

Et c'est là que j'ai eu l'idée de prendre une image matricielle de la forme de fenêtre requise, puis de la mettre à l'échelle en tant qu'objet matriciel unique.

 
Artyom Trishkin:

Et c'est là que j'ai eu l'idée de prendre une image bitmap de la forme de la fenêtre requise, puis de la mettre à l'échelle en tant qu'objet bitmap unique.

Qu'est-ce que ça pourrait être d'autre ? Je pense que c'est ce que Peter voulait.

Voici une fonction prête à l'emploi pour mettre à l'échelle une image stockée dans un tableau BMP[] de taillewidth_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();
  }
Dossiers :
CImage.mqh  12 kb
Raison: