Minha abordagem. O núcleo é o motor. - página 177

 
Реter Konow:

Preciso desenvolver uma solução. Minha janela consiste em um conjunto de objetos MT - telas. Suas imagens precisam ser reduzidas primeiro individualmente e depois combinadas em uma só. Precisamos de tal algoritmo. Isto é, digamos, individualmente, mas para combinar as imagens reduzidas, ainda não.

Calculando a mudança nas coordenadas relativas dos objetos. Eles têm um ponto de partida. X e Y. Recalcule-os em relação ao tamanho total em largura e altura da lona total - janela.

 
Artyom Trishkin:

Calculando a mudança nas coordenadas relativas dos objetos. Eles têm um ponto de partida. X e Y. Recalcule-os em relação à largura e altura totais do kanvas total - janela.

Eu entendi a idéia. Vou tentar se Nikolai disser que não. Obrigado.

 
Реter Konow:

Precisodesenvolver uma solução. Minha janela consiste em um conjunto de objetos MT - telas. Suas imagens precisam ser reduzidas primeiro individualmente e depois combinadas em uma só. Precisamos de tal algoritmo. Isto é, digamos, individualmente, mas para combinar as imagens reduzidas, ainda não.

Antes de mais nada, é claro, tem que ser feito. Quer dizer, tem que ter um olhar um pouco coerente. Mesmo nos velhos tempos eles diziam - pare, deixe sair ... Mas não importa, o trem não vai parar ;-) vamos considerar que esta é a versão do eterno autor ...

Já que estamos dançando com C#, olhe para OpenGL para estar "à frente do planeta". E desenhe com ela em "lona" (mas em lugares decentes não é chamado assim, é o contexto). Será uma loucura rápida e você pode sobrepor, escalar, girar, torcer como quiser.

 
Desculpe, vou passar.
Meu ponto de conforto é que eu mesmo estabeleço minhas próprias tarefas e as cumpro, e não estabeleço as tarefas de ninguém ou cumpro as tarefas de outra pessoa.

 
Artyom Trishkin:

Cálculo da mudança nas coordenadas relativas do objeto. Eles têm um ponto de partida. X e Y. Recalcule-as em relação à largura total e à altura da tela em geral - janela.

Este método de escalonamento vetorial será muito inferior visualmente ao escalonamento raster. E quanto ao texto? O tamanho da fonte "saltará" de forma desproporcional
O dimensionamento vetorial seria aceitável se as coordenadas das formas pudessem ser definidas para valores fracionários (duplos) em vez de inteiros (int). Mas isso exigiria uma nova biblioteca avançada de Telas com anti-aliasing.
 
Maxim Kuznetsov:

Antes de tudo, é claro, tem que ser feito. Quer dizer, tem que ter um olhar um pouco coerente com ele. A primeira coisa a fazer é fazer com que pareça um pouco mais holístico... É como diziam antigamente - pare, deixe sair...mas vamos lá, o trem nunca vai parar ;-) digamos que é a versão do eterno autor...

Já que estamos dançando com C#, olhe para OpenGL para estar "à frente do planeta". E desenhe com ela em "lona" (mas em lugares decentes não é chamado assim, é o contexto). Será uma loucura rápida e você pode sobrepor, escalar, girar, torcer como quiser.

Se escrever por si mesmo, claro. Mas toda essa coisa de análise está no mercado.
Você já trabalhou com OpenGL ou DirectX? Eles utilizam recursos de placas de vídeo?
ZS Mas é uma pergunta boba. É claro que sim.

Não consigo entender porque os desenvolvedores ferraram no OpenCL e não no OpenGL? Provavelmente, porque era mais fácil de fazer.

SZY Eu li sobre OpenCL. Eu li sobre OpenCL. Esta tecnologia é mais orientada para o cálculo e isso explica porque a escolha não foi a favor da OpenGL.

 
Peter, seria legal para você aprender o OpenCL para sua GUI. Se eu não estiver confuso, funcionará para o Mercado. Você só precisa ter o kernel OpenCL instalado pelos usuários e suas placas de vídeo para apoiá-lo, é claro.
Porque isso tem sido possível por muito tempo, mas até agora não houve nenhuma atividade nessa direção.

 
Nikolai Semko:
Este método de escalonamento vetorial seria visualmente muito inferior ao escalonamento raster. E quanto ao texto? O tamanho da fonte será desproporcionadamente "saltitante".
O dimensionamento vetorial seria aceitável se as coordenadas das formas pudessem ser definidas para valores fracionários (duplos) em vez de inteiros (int). Mas isso exigiria uma nova biblioteca avançada de Telas com anti-aliasing.

A primeira coisa que me veio à mente. Provavelmente influenciado por minha longa experiência com gráficos vetoriais no 3D Studio MAX - estou acostumado a pensar de tal maneira. Sim, é claro que tudo isso está em problemas e, a propósito, ganha muito visualmente a escala de raster no photoshop.

 
Nikolai Semko:
Este método de escalonamento vetorial seria visualmente muito inferior ao escalonamento raster. E quanto ao texto? O tamanho da fonte será desproporcionadamente "saltitante".
O dimensionamento vetorial seria aceitável se as coordenadas das formas pudessem ser definidas para valores fracionários (duplos) em vez de inteiros (int). Mas isso exigiria uma nova biblioteca avançada de Telas com anti-aliasing.

E foi aqui que me ocorreu: pegue uma imagem rasterizada da janela em forma de janela necessária, e depois escale-a como um único objeto rasterizado.

 
Artyom Trishkin:

E foi aqui que me ocorreu: pegue um bitmap da janela necessária e depois escale-o como um único objeto bitmap.

O que mais poderia ser? Acho que era isso que Peter queria.

Aqui está uma função pronta para uso para aumentar a escala de uma imagem armazenada na matriz BMP[] com tamanhowidth_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();
  }
Arquivos anexados:
CImage.mqh  12 kb