Benim yaklaşımım. Çekirdek - Motor. - sayfa 177

 
Реter Konow :

Bir çözüm geliştirmemiz gerekiyor. Pencerem bir dizi MT nesnesinden - tuvallerden oluşuyor. Görüntüleri önce tek tek küçültülmeli ve ardından bir araya getirilmelidir. Böyle bir algoritmaya ihtiyacımız var. Yani bireysel olarak var diyelim ama küçültülmüş resimleri birleştirmek için henüz değil.

Nesnelerin göreli koordinatlarındaki değişikliklerin hesaplanması. Onların da bir başlangıç noktası var. X ve Y'de. Bunları genel tuval - pencerenin genişlik ve yüksekliğindeki toplam boyuta göre yeniden hesaplayın.

 
Artyom Trishkin :

Nesnelerin göreli koordinatlarındaki değişikliklerin hesaplanması. Onların da bir başlangıç noktası var. X ve Y'de. Bunları genel tuval - pencerenin genişlik ve yüksekliğindeki toplam boyuta göre yeniden hesaplayın.

Anladım. Nikolai reddederse deneyeceğim. Teşekkür ederim.

 
Реter Konow :

Bir çözüm geliştirmemiz gerekiyor . Pencerem bir dizi MT nesnesinden - tuvallerden oluşuyor. Görüntüleri önce tek tek küçültülmeli ve ardından bir araya getirilmelidir. Böyle bir algoritmaya ihtiyacımız var. Yani bireysel olarak var diyelim ama küçültülmüş resimleri birleştirmek için henüz değil.

İlk olarak, elbette, yapılmalıdır. yani biraz tutarlı bir görünüme sahip olmak. Eskiden derlerdi - dur mezun ol.. Peki, tamam, motor durdurulamaz ;-) bunun ebedi yazarın versiyonu olduğunu varsayacağız ..

C# ile böyle bir dans gittiğinden beri, "gezegenin geri kalanının önünde" olmak için - OpenGL'ye bakın. Ve onları "tuval" üzerine çizin (gerçi uygun yerlerde buna böyle denmese de, bağlamdır). İnanılmaz derecede hızlı olacak ve istediğiniz her şeyi üst üste bindirebilir, ölçekleyebilir, döndürebilir, deforme edebilirsiniz.

 
Üzgünüm, geçtim.
Benim teselli ettiğim nokta, kendime görevler koyup onları yerine getirdiğimde ve kimseye görev vermediğimde, kimsenin görevini de yerine getirmediğimde.

 
Artyom Trishkin :

Nesnelerin göreli koordinatlarındaki değişikliklerin hesaplanması. Onların da bir başlangıç noktası var. X ve Y'de. Bunları genel tuval - pencerenin genişlik ve yüksekliğindeki toplam boyuta göre yeniden hesaplayın.

Bu vektör ölçekleme yöntemi, raster ölçeklendirmeye görsel olarak çok zarar verecektir. Peki ya metin? Yazı tipi boyutu orantısız bir şekilde atlayacak
Şekillerin koordinatları tamsayı (int) değerlerle değil, kesirli (çift) değerlerle verilseydi, vektör ölçeklendirmesi kabul edilebilirdi. Ancak bu, kenar yumuşatma özelliğine sahip yeni bir gelişmiş Canvas kitaplığı gerektirir.
 
Maxim Kuznetsov :

İlk olarak, elbette, yapılmalıdır. yani biraz tutarlı bir görünüme sahip olmak. Eskiden derlerdi - dur mezun ol.. Peki, tamam, motor durdurulamaz ;-) bunun ebedi yazarın versiyonu olduğunu varsayacağız ..

C# ile böyle bir dans gittiğinden beri, "gezegenin geri kalanının önünde" olmak için - OpenGL'ye bakın. Ve onları "tuval" üzerine çizin (gerçi uygun yerlerde buna böyle denmese de, bağlamdır). İnanılmaz derecede hızlı olacak ve istediğiniz her şeyi üst üste bindirebilir, ölçekleyebilir, döndürebilir, deforme edebilirsiniz.

Kendiniz için yazarsanız, elbette. Ama bütün maydanoz piyasada.
OpenGL veya DirectX ile çalıştınız mı? Ekran kartı kaynaklarını kullanıyorlar mı?
ZY Aptalca bir soru olsa da. Tabii ki evet.

Geliştiricilerin neden OpenGL'yi değil de OpenCL'yi becerdiğini anlayamıyorum? Muhtemelen daha kolay olduğu için.

ZYY OpenCL hakkında saygıdeğer. Bu teknoloji daha çok bilgi işlem odaklı olduğundan, tercihin neden OpenGL lehine yapılmadığı anlaşılabilir.

 
Peter, GUI'niz için OpenCL'de ustalaşmanız harika olur. Hiçbir şeyi karıştırmazsam, o zaman piyasa için işe yarayacaktır. Kullanıcıların OpenCL çekirdeğini yalnızca kendileri için yüklemeleri ve elbette video kartlarının bunu desteklemesi gerekir.
Ve sonra uzun zamandır böyle bir fırsat var, ancak bu yönde henüz bir faaliyet gözlenmedi.

 
Nikolai Semko :
Bu vektör ölçekleme yöntemi, raster ölçeklendirmeye görsel olarak çok zarar verecektir. Peki ya metin? Yazı tipi boyutu orantısız bir şekilde atlayacak
Şekillerin koordinatları tamsayı (int) değerlerle değil, kesirli (çift) değerlerle verilseydi, vektör ölçeklendirmesi kabul edilebilirdi. Ancak bu, kenar yumuşatma özelliğine sahip yeni bir gelişmiş Canvas kitaplığı gerektirir.

Aklıma ilk gelen şey. Muhtemelen 3D Studio MAX'taki vektör grafikleriyle uzun süredir devam eden çalışmam etkiliyor - böyle düşünmeye alışkınım. Evet, elbette her şey iki katına çıkar ve bu arada, Photoshop'ta bitmap ölçekleme üzerinde görsel olarak çok şey kazanır.

 
Nikolai Semko :
Bu vektör ölçekleme yöntemi, raster ölçeklemeden görsel olarak çok daha düşük olacaktır. Peki ya metin? Yazı tipi boyutu orantısız bir şekilde atlayacak
Şekillerin koordinatları tamsayı (int) değerlerle değil, kesirli (çift) değerlerle verilseydi, vektör ölçeklendirmesi kabul edilebilirdi. Ancak bu, kenar yumuşatma özelliğine sahip yeni bir gelişmiş Canvas kitaplığı gerektirir.

Ve burada aklıma bir SMS geldi: Gerekli form penceresinin bitmap görüntüsünü alıyoruz ve ardından onu tek bir bitmap nesnesi olarak ölçeklendiriyoruz.

 
Artyom Trishkin :

Ve burada aklıma bir SMS geldi: Gerekli form penceresinin bitmap görüntüsünü alıyoruz ve ardından onu tek bir bitmap nesnesi olarak ölçeklendiriyoruz.

Peki, başka nasıl? Sanırım Peter'ın istediği buydu.

İşte, BMP[] dizisinde bulunan, width_bmp x height_bmp boyutlarında hazır bir raster ölçeklendirme işlevi

 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();
  }
Dosyalar:
CImage.mqh  12 kb