Fonction de décomposition de la couleur en nuances. - page 9

 
Nikolai Semko:

Peter, le problème est que vous avez posté une fonction sur le forum pour que tout le monde puisse la voir et appliquer la décomposition des couleurs. Mais cette fonction ne génère pas le tableau de couleurs nécessaire, mais seulement un tableau de chaînes de caractères, qui n'est bon que pour une sortie imprimée, au lieu de montrer votre dégradé à l'écran. C'est un cochon dans un poke et aucun respect pour les autres. Vous pouvez le traduire vous-mêmes si vous le souhaitez.

C'est déjà de la diffamation et de la calomnie pure et simple. J'ai délibérément choisi le type de chaîne pour qu'il soit plus facile de voir les composants et de les isoler. J'ai expliqué ma technique de solution en détail sur la première page. Vous n'avez rien expliqué. Je ne suis pas sûr que vous compreniez bien vous-même comment fonctionne votre méthode de décomposition des couleurs. Si vous ne le faites pas, expliquez-le avec autant de détails que je l'ai fait.

Et ne faites pas d'accusations aussi bruyantes. Il se peut que vous commettiez vous-même des erreurs.

 
Et ne vous disputez pas. Allons au fond des choses.
 
Реter Konow:

C'est de la calomnie pure et simple et de la diffamation. J'ai délibérément choisi le type de ficelle, afin qu'il soit plus facile de voir les composants et de les distinguer. J'ai expliqué en détail la technique de ma solution sur la première page. Vous n'avez rien expliqué. Je ne suis pas sûr que vous compreniez bien vous-même comment fonctionne votre méthode de décomposition des couleurs. Si vous ne le faites pas, expliquez-le avec autant de détails que je l'ai fait.

Et ne faites pas d'accusations aussi bruyantes. Vous pourriez vous tromper vous-même.

Désolé - je viens seulement de lire votre explication :

  • Tout d'abord, j'ai décomposé la couleur en trois composantes principales, en définissant senior, moyen, junior.
  • Ensuite, j'ai commencé à faire des graphiques et à tracer des lignes à travers les valeurs des composants.
  • En regardant les chiffres changer dans la palette au fur et à mesure que je faisais glisser le curseur, j'ai réalisé qu'il y avait une réfraction dans l'angle d'ascension des lignes, car à un moment donné, le taux de changement des chiffres a changé.
  • J'ai placé l'axe de réfraction des lignes au centre du graphique, et j'ai vu que chaque ligne est constituée de deux segments, chacun ayant son propre angle d'ascension.
  • En outre, en expérimentant avec la palette de couleurs, j'ai réalisé qu'il existe un angle d'ascension maximal pour la composante supérieure. Au début, je pensais que c'était 67,5 degrés. Cependant, la pratique a montré qu'elle est de 63,5 degrés.
  • Pendant longtemps, je n'ai pas réussi à trouver comment tracer correctement les segments de ligne des composantes de couleur. Il y avait beaucoup d'inconnus. Mais l'essentiel est de savoir comment trouver les coordonnées de la couleur d'origine sur le graphique.
  • En continuant à expérimenter avec la palette, j'ai remarqué qu'en modifiant la valeur de la couleur d'un certain nombre, le curseur se déplaçait d'une certaine distance. Petit à petit, j'ai compris que la distance parcourue par le curseur correspond à la moitié de la valeur de la composante d'ordre inférieur.
  • J'ai supposé que si je trouvais la coordonnée de la composante supérieure de la ligne d'angle d'ascension maximale et que j'ajoutais la moitié de la composante inférieure à ce point, je trouverais la coordonnée de la couleur d'origine dans le graphique. La pratique a prouvé que cette hypothèse était correcte.
  • Ayant une coordonnée de la couleur initiale et un axe de réfraction, je pouvais calculer les angles de chacune des pièces et recevoir des valeurs pour chaque composant le long de sa ligne. J'ai utilisé la trigonométrie du lycée pour ça.

Je ne peux pas faire ça. C'est plus prosaïque et primitif.
Il est difficile d'expliquer plus largement que le code lui-même :

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:


Encore une fois :

  • Prenez mon algorithme tel que je l'ai créé. Sans vos corrections.
  • Définissez votre couleur. Exécutez le script sur MT4.
  • Vous obtiendrez toutes les couleurs grâce à l'alerte.
  • Entrez la couleur originale dans la palette des fenêtres.
  • Vérifiez la correspondance.

C'est la meilleure façon de vérifier que l'algorithme fonctionne correctement.

Ensuite, vous pouvez passer à un contrôle de vitesse.

Vous, en revanche, avez pris mon algorithme, modifié les lignes comme bon vous semble, puis l'avez exécuté sur une autre plate-forme et l'avez affiché selon votre technique de dessin. Ayant effectué tant de changements indépendants, vous jugez mon algorithme comme si vous ne remarquiez pas comment vous l'avez vous-même modifié et mis dans des conditions différentes. Conditions dans lesquelles vous pouvez vous-même commettre une erreur. Alors, découvrons-le calmement.

 
Реter Konow:

Encore une fois :

  • Prenez mon algorithme tel que je l'ai créé. Sans vos corrections.
  • Définissez votre couleur. Exécutez le script sur MT4.
  • Vous obtiendrez toutes les couleurs grâce à l'alerte.
  • Entrez la couleur originale dans la palette Windows.
  • Vérifiez la correspondance.

C'est la meilleure façon de vérifier que l'algorithme fonctionne correctement.

Ensuite, vous pouvez passer à un contrôle de vitesse.

Vous, en revanche, avez pris mon algorithme, modifié les lignes comme bon vous semble, puis l'avez exécuté sur une autre plate-forme et l'avez affiché selon votre technique de dessin. Ayant effectué tant de changements indépendants, vous jugez mon algorithme comme si vous ne remarquiez pas comment vous l'avez vous-même modifié et mis dans des conditions différentes. Conditions dans lesquelles vous pouvez vous-même commettre une erreur. Alors, découvrons-le calmement.

Peter, je n'ai pas besoin de 256 combinaisons de trois chiffres dans mon alerte. J'ai besoin de couleur. Tout ce que j'ai fait dans votre fonction, c'est de convertir la couleur en uint, comme il se doit. Je ne suis pas entré dans votre algorithme, car sa logique dépasse mon entendement.

 
Nikolai Semko:

Peter, je ne veux pas 256 combinaisons de trois chiffres de couleur dans une alerte. J'ai besoin de couleur. Tout ce que j'ai fait dans votre fonction, c'est de convertir la couleur en uint au lieu de string, comme il se doit. Je ne suis pas entré dans votre algorithme, car sa logique dépasse mon entendement.

Le contrôle par les chiffres est le meilleur. Vous ne pouvez pas comparer les nuances de couleurs à l'œil nu. Les moniteurs sont différents et la perception peut être différente. C'est pourquoi les chiffres sont le meilleur contrôle.

Et il n'y a pas de logique démesurée. Trigonométrie scolaire.

1. Calculez les angles de six segments.

2. Ensuite, calculez les valeurs en chaque point de ces segments et écrivez-les dans un tableau.

C'est tout.

 
Реter Konow:

La vérification par les chiffres est la meilleure. Vous ne pouvez pas exactement comparer les nuances de couleurs à l'œil nu. Les moniteurs sont différents et la perception peut être différente. C'est pourquoi les chiffres sont le meilleur contrôle.

Et il n'y a pas de logique démesurée. Trigonométrie scolaire.

1. Calculez les angles de six segments.

2. Ensuite, calculez les valeurs en chaque point de ces segments et écrivez-les dans un tableau.

C'est tout.

Mais en fait, ma fonction fonctionne sans problème et est 4 fois plus rapide. J'attends votre résultat lorsque vous fournirez votre algorithme le 5. Cela m'a pris un certain temps de copier simplement via le presse-papiers, et vous avez pris quelque chose de plus long.

 
Nikolai Semko:

Mais en fait, ma fonction fonctionne sans problème et est 4 fois plus rapide. J'attends votre résultat, lorsque vous fournirez votre algorithme sur 5. Il m'a fallu un certain temps pour simplement copier dans le presse-papiers, et vous en avez pris encore plus.

Nikolaï, on dirait un jardin d'enfants. L'affirmation "4 fois plus rapide" n'est pas valable car elle n'est pas prouvée.


  1. Commentez la ligne dans votre version de ma solution sur MT5 et vous verrez la différence.

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

Cette ligne affecte le dessin de l'ensemble du rectangle pour une raison quelconque. Mais ce n'est pas mon problème. Regardez ça.

Je continue à examiner les problèmes que vous avez. Je veux voir si c'est vraiment à cause de mon algorithme.


Et éteignez le clignotement inutile des chiffres. Enlevez tous les trucs inutiles. Affichons une fois un simple rectangle avec un gradient d'une couleur originale. Sans gadgets inutiles.

 
De manière générale, la fonction permettant d'obtenir un tableau de gradients entre deux couleurs est plus utile. car elle est plus simple et plus utile en pratique.
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;
     }
  }

Si vous avez besoin d'un dégradé d'une couleur vers le blanc ou vers le noir, vous pouvez l'obtenir avec cette fonction.

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


Dossiers :
 
Реter Konow:

La vérification par les chiffres est la meilleure. Vous ne pouvez pas exactement comparer les nuances de couleurs à l'œil nu. Les moniteurs sont différents et la perception peut être différente. C'est pourquoi les chiffres sont le meilleur contrôle.

Je vais me joindre aux "accusations", je n'en pouvais plus :)

Un bon exemple de comment ne pas programmer. Si c'est ainsi qu'est écrite toute votre interface graphique, nous ne la verrons pas avant longtemps. :(

Chaque ligne est un "chef-d'œuvre" : un tel amoncellement d'erreurs et de ratés, tant d'espoir que mql4 s'en sorte. Je comprends maintenant pourquoi mt4 est utilisé.

Je pense que la publication de tels codes et la réaction subséquente aux critiques ne respectent pas l'audience du forum. Ils ne veulent pas vous faire de mal, ils veulent vous aider.

Quant à la comparaison des algorithmes, vous pouvez les comparer visuellement. Ce n'est pas comme si vous aviez prouvé par des chiffres que votre algorithme donne des teintes proches à 99% des "teintes de fenêtres".

À gauche, c'est un peu votre approche, à droite,celle de Nikolai Semko. (Un script modifié deNikolai Semko a été utilisé)


Dossiers :