Rengi gölgelere ayırma işlevi. - sayfa 9

 
Nikolai Semko :

Peter, soru şu ki, herkesin renk ayrıştırmasını görmesi ve uygulaması için forumda bir işlev yayınladınız. Ancak bu işlev istenen renk dizisini değil, yalnızca gradyanını ekranda göstermek yerine yalnızca Print output için uygun olan bir dize dizisini oluşturur. Bu bir dürtme domuz ve başkalarına saygı yok. Mesela, ihtiyacı olan varsa kendin tercüme et.

Bu düpedüz iftira ve gag. Bileşenleri görmeyi ve izole etmeyi kolaylaştırmak için kasıtlı olarak dize türünü seçtim. Çözümümün tekniğini ilk sayfada detaylı olarak anlattım. Hiçbir şey açıklamadın. Renk ayrıştırma yönteminizin nasıl çalıştığını tam olarak anladığınızdan emin değilim. Durum böyle değilse, yaptığım kadar ayrıntılı olarak açıklayın.

Ve bu kadar büyük suçlamalarda bulunma. Onlara gerçekten kendin kayabilirsin.

 
Ve kavgaya girme. Sonuna kadar çözelim.
 
Реter Konow :

Bu düpedüz iftira ve gag. Bileşenleri görmeyi ve izole etmeyi kolaylaştırmak için kasıtlı olarak dize türünü seçtim. Çözümümün tekniğini ilk sayfada detaylı olarak anlattım. Hiçbir şey açıklamadın. Renk ayrıştırma yönteminizin nasıl çalıştığını tam olarak anladığınızdan emin değilim. Durum böyle değilse, yaptığım kadar ayrıntılı olarak açıklayın.

Ve bu kadar büyük suçlamalarda bulunma. Onlara gerçekten kendin kayabilirsin.

Üzgünüm, açıklamanızı şimdi okudum:

  • İlk olarak, rengi en yüksek, orta ve en düşük olanı belirleyerek üç ana bileşene ayırdım.
  • Ayrıca, bileşenlerin değerleri üzerinden grafikler oluşturmaya ve çizgiler çizmeye başladım.
  • Kaydırıcıyı sürüklerken paletteki sayıların değişimini gözlemleyerek, belli bir anda sayıların değişim hızı değiştiği için çizgilerin çıkış açısında bir kırılma olduğunu fark ettim.
  • Çizgilerin kırılma eksenini grafiğin merkezine ayarladım ve her çizginin, her birinin kendi yükselme açısına sahip iki parçadan oluştuğunu gördüm.
  • Ayrıca, renk paleti ile deneyler yaparak, en yüksek bileşenin maksimum çıkış açısı olduğunu fark ettim. İlk başta 67.5 derece olduğunu düşündüm. Ancak, uygulama 63,5 dereceye eşit olduğunu göstermiştir.
  • Uzun bir süre, renk bileşenlerinin doğru parçalarını nasıl doğru çizeceğimi çözemedim. Birçok bilinmeyen vardı. Ama asıl mesele, grafikteki orijinal rengin koordinatını nasıl bulacağınızdır?
  • Paleti denemeye devam ederken , renk değerini belirli bir sayı ile değiştirirken kaydırıcının belirli bir mesafe hareket ettiğini fark ettim. Yavaş yavaş, kaydırıcının kaydırma mesafesinin küçük bileşenin değerinin yarısına eşit olduğunu fark ettim.
  • Maksimum yükselme açısı doğrusu üzerinde en yüksek bileşenin koordinatını bulup bu noktaya en alttaki bileşenin değerinin yarısını eklersem, grafikte orijinal rengin koordinatını bulacağımı varsaydım. Uygulama, varsayımın doğru olduğunu kanıtladı.
  • Orijinal rengin koordinatı ve kırılma ekseni göz önüne alındığında, segmentlerin her birinin açılarını hesaplayabilir ve çizgisi boyunca her bileşen için değerler alabilirim. Bunu yapmak için okul trigonometrisini kullandım.

Bunu yapamam. Her şey benim için daha sıradan ve ilkel.
Kodun kendisinden daha kapsamlı bir şekilde açıklamak zordur:

 void Gradient( uint clr, uint &arr[], uint size)
  {
   if (size== 0 ) return ;
   ArrayResize (arr,size);
   rgb c;
   c.clr=clr;
   uchar R=c.c[ 2 ],G=c.c[ 1 ],B=c.c[ 0 ];
   uint i= 0 , tone= uint ((size- 1 )*((( double )R+( double )G+( double )B)/ 765.0 )+ 0.4999 );
   double kR,kG,kB;
   if (tone!= 0 )
     {
      kR=( double )R/tone; 
      kG=( double )G/tone;
      kB=( double )B/tone;
       for (i= 0 ;i<=tone;i++)
        {
         c.c[ 2 ]= uchar (i*kR+ 0.4999 );
         c.c[ 1 ]= uchar (i*kG+ 0.4999 );
         c.c[ 0 ]= uchar (i*kB+ 0.4999 );
         arr[i]=c.clr;
        }
     }
   if (tone!=(size- 1 ))
     {
      kR=( double )( 255 -R)/(size-i);
      kG=( double )( 255 -G)/(size-i);
      kB=( double )( 255 -B)/(size-i);
       for ( uint j= 1 ;i<size;i++,j++)
        {
         c.c[ 2 ]= uchar (R+j*kR+ 0.4999 );
         c.c[ 1 ]= uchar (G+j*kG+ 0.4999 );
         c.c[ 0 ]= uchar (B+j*kB+ 0.4999 );
         arr[i]=c.clr;
        }
     }
  }
 
Nikolai Semko :


Tekrar:

  • Algoritmamı oluşturduğum gibi al. Herhangi bir düzeltme yapmadan.
  • Renginizi ayarlayın. Komut dosyasını MT4'te çalıştırın.
  • Uyarı yoluyla tüm renkleri alacaksınız.
  • Orijinal rengi Windows paletine girin.
  • Uyumluluğu kontrol edin.

Bu, algoritmanın doğruluğu için en iyi testtir.

Ardından, hız testine gidebilirsiniz.

Algoritmamı aldınız, kendi takdirinize göre içindeki çizgileri değiştirdiniz, ardından başka bir platformda başlattınız ve çizim tekniğinize göre ekranda gösterdiniz. Pek çok bağımsız değişiklik yaptıktan sonra, algoritmamı nasıl değiştirdiğinizi fark etmemiş ve farklı koşullara koymuş gibi yargılıyorsunuz. Kendinizin yanılabileceği durumlar. Öyleyse öğrenelim.

 
Реter Konow :

Tekrar:

  • Algoritmamı oluşturduğum gibi al. Herhangi bir düzeltme yapmadan.
  • Renginizi ayarlayın. Komut dosyasını MT4'te çalıştırın.
  • Uyarı yoluyla tüm renkleri alacaksınız.
  • Orijinal rengi Windows paletine girin.
  • Uyumluluğu kontrol edin.

Bu, algoritmanın doğruluğu için en iyi testtir.

Ardından, hız testine gidebilirsiniz.

Algoritmamı aldınız, kendi takdirinize göre içindeki çizgileri değiştirdiniz, ardından başka bir platformda başlattınız ve çizim tekniğinize göre ekranda gösterdiniz. Pek çok bağımsız değişiklik yaptıktan sonra, algoritmamı nasıl değiştirdiğinizi fark etmemiş ve farklı koşullara koymuş gibi yargılıyorsunuz. Kendinizin yanılabileceği durumlar. Öyleyse öğrenelim.

Peter, üç sayının 256 kombinasyonu şeklinde uyarıda renklere ihtiyacım yok. renge ihtiyacım var. İşlevinde yaptığım tek şey, olması gerektiği gibi, rengi bir dize yerine uint'e dönüştürmekti. Algoritmanıza uymadım çünkü mantığı beni aşıyor.

 
Nikolai Semko :

Peter, üç sayının 256 kombinasyonu şeklinde uyarıda renklere ihtiyacım yok. renge ihtiyacım var. İşlevinde yaptığım tek şey, olması gerektiği gibi, rengi bir dize yerine uint'e dönüştürmekti. Algoritmanıza uymadım çünkü mantığı beni aşıyor.

Numara kontrolü en iyisidir. Renk tonlarını gözle karşılaştıramazsınız. Burada monitörler farklıdır ve algı farklı olabilir. Yani sayılar en iyi testtir.

Ve orada aşkın bir mantık yoktur. Okul trigonometrisi.

1. Altı parçanın açılarını hesaplamanız gerekiyor.

2. Ardından bu segmentlerin her noktasındaki değerleri hesaplayıp diziye yazın.

Herşey.

 
Реter Konow :

Numara kontrolü en iyisidir. Renk tonlarını gözle gerçekten karşılaştıramazsınız. Burada monitörler farklıdır ve algı farklı olabilir. Yani sayılar en iyi testtir.

Ve orada aşkın bir mantık yoktur. Okul trigonometrisi.

1. Altı parçanın açılarını hesaplamanız gerekiyor.

2. Ardından bu segmentlerin her noktasındaki değerleri hesaplayıp diziye yazın.

Herşey.

Ama aslında, işlevim sorunsuz çalışıyor ve 4 kat daha hızlı. 5-ke üzerinde algoritmanızı sağladığınızda sonucunuzu bekliyorum. Panodan kopyalamak biraz zamanımı aldı ama sizin için bir şey biraz daha uzun sürdü.

 
Nikolai Semko :

Ama aslında, işlevim sorunsuz çalışıyor ve 4 kat daha hızlı. 5-ke üzerinde algoritmanızı sağladığınızda sonucunuzu bekliyorum. Panodan kopyalamak biraz zamanımı aldı ama sizin için bir şey biraz daha uzun sürdü.

Nikolai, anaokulu gibi. "4 kat daha hızlı" ifadesi kanıtlanmadığı için geçerli değildir.


  1. MT5'teki çözümünüzün sürümünüzdeki satırı yorumlayın ve farkı göreceksiniz.

canvas. TextOut ( 300 , 10 , "Время формирования градиентного массива из 256 элементов = " + string (t)+ " микросекунд" , ColorToARGB ( clrWhite ));

Bu çizgi nedense tüm dikdörtgenin çizimini etkiler. Ama bu benim hatam değil. Kontrol etmek.

Görünen o aksaklıkları anlamaya devam ediyorum. Algoritmam nedeniyle geçerli olup olmadıklarını anlamak istiyorum.


Ve sayıların gereksiz titremesini kapatın. Tüm gereksizleri kaldırın. Bir başlangıç renginin gradyanına sahip basit bir dikdörtgenin bir kez görüntülenmesine izin verin. Ekstra fırfırlar yok.

 
Genel olarak konuşursak, iki renk arasında bir dizi gradyan elde etmek için bir fonksiyon daha arzu edilir. Çünkü pratikte daha kolay ve daha kullanışlıdır.
 void Gradient( uint clr1, uint clr2, uint &arr[], uint size)
  {
   if (size== 0 ) return ;
   ArrayResize (arr,size);
   rgb c1,c2;
   c1.clr=clr1;
   c2.clr=clr2;
   double R1=c1.c[ 2 ],G1=c1.c[ 1 ],B1=c1.c[ 0 ];
   double R2=c2.c[ 2 ],G2=c2.c[ 1 ],B2=c2.c[ 0 ];
   double deltaR=(R2-R1)/(size- 1 );
   double deltaG=(G2-G1)/(size- 1 );
   double deltaB=(B2-B1)/(size- 1 );
   for ( uint i= 0 ;i<size;i++)
     {
      R1+=deltaR; c1.c[ 2 ]= uchar (R1+ 0.4999 );
      G1+=deltaG; c1.c[ 1 ]= uchar (G1+ 0.4999 );
      B1+=deltaB; c1.c[ 0 ]= uchar (B1+ 0.4999 );
      arr[i]=c1.clr;
     }
  }

Bir rengin beyaza veya siyaha geçişine ihtiyacınız varsa, bu işlevi kullanarak bunları bu şekilde elde edebilirsiniz.

   color clr= clrViolet ;
   uint CLR[];
   Gradient( clrWhite , clr, CLR, 100 ); // получаем массив из 100 элементов градиента от белого цвета до цвета clr 
   Gradient(clr, clrBlack , CLR, 100 ); // получаем массив из 100 элементов градиента от цвета clr до черног цвета   


Dosyalar:
 
Реter Konow :

Numara kontrolü en iyisidir. Renk tonlarını gözle gerçekten karşılaştıramazsınız. Burada monitörler farklıdır ve algı farklı olabilir. Yani sayılar en iyi testtir.

"Suçlamalara" katılacağım, dayanamadım :)

Programlama yapılmamasına güzel bir örnek. GUI'nizin tamamı bu şekilde yazılmışsa, yakında görmeyeceğiz. :(

Her satır bir "şaheser"dir: öyle bir hata ve gaf yığını, mql4'ün onu ortadan kaldıracağını umarız. Şimdi neden MT4'ün kullanıldığı ortaya çıktı.

Bu tür kodların yayınlanması ve ardından gelen eleştirilere tepki, bunun forumun izleyicilerine saygı duymadığını düşünüyorum. Zarar istemiyorsun - sana yardım etmek istiyorlar.

Ve algoritmaların karşılaştırılması hakkında görsel olarak karşılaştırılabilir. Algoritmanızın "Windows gölgelerine" %99 yakın gölgeler verdiğine dair rakamlarla herhangi bir kanıt sunmadınız.

Solda - sanki yaklaşımınız, sağda - Nikolai Semko . (Değiştirilmiş bir Nikolai Semko komut dosyası kullanıldı)


Dosyalar: