Die Funktion, Farbe in Schattierungen zu zerlegen. - Seite 9

 
Nikolai Semko:

Peter, das Problem ist, dass Sie eine Funktion ins Forum gestellt haben, die für alle sichtbar ist und die Farbzerlegung anwendet. Aber diese Funktion erzeugt nicht das notwendige Farbarray, sondern nur ein String-Array, das nur für die Druckausgabe geeignet ist, anstatt den Farbverlauf auf dem Bildschirm darzustellen. Sie ist die Katze im Sack und hat keinen Respekt vor anderen. Sie können sie selbst übersetzen, wenn Sie wollen.

Dies ist bereits eine üble Nachrede und Verleumdung. Ich habe mich bewusst für den String-Typ entschieden, um die Komponenten besser erkennen und isolieren zu können. Ich habe meine Lösungstechnik auf der ersten Seite ausführlich erläutert. Sie haben nichts erklärt. Ich bin mir nicht sicher, ob Sie selbst vollständig verstehen, wie Ihre Methode der Farbzerlegung funktioniert. Wenn Sie das nicht tun, erklären Sie es so ausführlich wie ich.

Und machen Sie keine so lauten Anschuldigungen. Vielleicht machen Sie selbst einen Fehler.

 
Und lassen Sie sich nicht auf einen Streit ein. Gehen wir der Sache auf den Grund.
 
Реter Konow:

Dies ist eine glatte Verleumdung und üble Nachrede. Ich habe die Art der Zeichenkette absichtlich gewählt, um die Komponenten besser erkennen und isolieren zu können. Ich habe die Technik meiner Lösung auf der ersten Seite ausführlich erläutert. Sie haben nichts erklärt. Ich bin mir nicht sicher, ob Sie selbst vollständig verstehen, wie Ihre Methode der Farbzerlegung funktioniert. Wenn Sie das nicht tun, erklären Sie es so ausführlich wie ich.

Und erheben Sie nicht so lautstarke Anschuldigungen. Sie könnten selbst einen Fehler machen.

Entschuldigung - ich habe Ihre Erklärung erst jetzt gelesen:

  • Zunächst habe ich die Farbe in drei Hauptbestandteile zerlegt, indem ich Senior, Middle und Junior definiert habe.
  • Dann begann ich, Diagramme zu erstellen und Linien durch die Komponentenwerte zu ziehen.
  • Als ich beobachtete, wie sich die Zahlen in der Palette beim Ziehen des Schiebereglers änderten, stellte ich fest, dass es eine Brechung im Anstiegswinkel der Linien gab, weil sich die Änderungsrate der Zahlen an einem bestimmten Punkt änderte.
  • Ich habe die Brechungsachse der Linien in der Mitte des Diagramms platziert und gesehen, dass jede Linie aus zwei Segmenten besteht, die jeweils einen eigenen Aszensionswinkel haben.
  • Außerdem habe ich beim Experimentieren mit der Farbpalette festgestellt, dass es einen maximalen Steigungswinkel für die höhere Komponente gibt. Zuerst dachte ich, es seien 67,5 Grad. Die Praxis zeigte jedoch, dass es 63,5 Grad sind.
  • Lange Zeit konnte ich nicht herausfinden, wie man die Liniensegmente der Farbkomponenten korrekt darstellt. Es gab viele Unbekannte. Aber das Wichtigste ist: Wie findet man die Koordinate der ursprünglichen Farbe im Diagramm?
  • Als ich weiter mit der Palette experimentierte, bemerkte ich, dass sich der Schieberegler um eine bestimmte Strecke bewegte, wenn ich den Wert der Farbe um eine bestimmte Zahl veränderte. Nach und nach wurde mir klar, dass die Entfernung, die der Schieberegler zurücklegt, die Hälfte des Wertes der Komponente niedriger Ordnung ist.
  • Ich nahm an, dass ich, wenn ich die Koordinate der höheren Komponente in der Linie des maximalen Steigungswinkels finde und die Hälfte der niedrigeren Komponente zu diesem Punkt addiere, die Koordinate der ursprünglichen Farbe im Diagramm finden würde. Die Praxis hat bewiesen, dass diese Annahme richtig war.
  • Da ich eine Koordinate der Ausgangsfarbe und eine Brechungsachse hatte, konnte ich die Winkel der einzelnen Teile berechnen und erhielt Werte für jede Komponente entlang ihrer Linie. Dafür habe ich Trigonometrie aus der Schule verwendet.

Das kann ich nicht tun. Es ist eher prosaisch und primitiv.
Es ist schwierig, mehr zu erklären als den Code selbst:

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:


Ein weiteres Mal:

  • Nehmen Sie meinen Algorithmus, wie ich ihn erstellt habe. Ohne Ihre Korrekturen.
  • Legen Sie Ihre Farbe fest. Führen Sie das Skript auf MT4 aus.
  • Sie erhalten alle Farben durch den Alarm.
  • Geben Sie die Originalfarbe in die Fensterpalette ein.
  • Prüfen Sie die Übereinstimmung.

So lässt sich am besten überprüfen, ob der Algorithmus richtig funktioniert.

Dann können Sie zu einer Geschwindigkeitskontrolle übergehen.

Sie hingegen haben meinen Algorithmus genommen, die Linien darin nach Ihrem Gutdünken verändert, ihn dann auf einer anderen Plattform laufen lassen und ihn entsprechend Ihrer Zeichentechnik dargestellt. Nachdem Sie so viele unabhängige Änderungen vorgenommen haben, urteilen Sie über meinen Algorithmus, als ob Sie nicht bemerken, wie Sie ihn selbst verändert und unter andere Bedingungen gestellt haben. Bedingungen, unter denen Sie selbst einen Fehler haben könnten. Finden wir es also in aller Ruhe heraus.

 
Реter Konow:

Ein weiteres Mal:

  • Nehmen Sie meinen Algorithmus, wie ich ihn erstellt habe. Ohne Ihre Korrekturen.
  • Legen Sie Ihre Farbe fest. Führen Sie das Skript auf MT4 aus.
  • Sie erhalten alle Farben durch den Alarm.
  • Geben Sie die Originalfarbe in die Windows-Palette ein.
  • Prüfen Sie die Übereinstimmung.

So lässt sich am besten überprüfen, ob der Algorithmus richtig funktioniert.

Dann können Sie zu einer Geschwindigkeitskontrolle übergehen.

Sie hingegen haben meinen Algorithmus genommen, die Linien darin nach Ihrem Gutdünken verändert, ihn dann auf einer anderen Plattform laufen lassen und ihn entsprechend Ihrer Zeichentechnik dargestellt. Nachdem Sie so viele unabhängige Änderungen vorgenommen haben, urteilen Sie über meinen Algorithmus, als ob Sie nicht bemerken, wie Sie ihn selbst verändert und unter andere Bedingungen gestellt haben. Bedingungen, unter denen Sie selbst einen Fehler haben könnten. Finden wir es also in aller Ruhe heraus.

Peter, ich brauche keine 256 Kombinationen von drei Ziffern in meiner Meldung. Ich brauche Farbe. Alles, was ich in Ihrer Funktion getan habe, war, Farbe in uint zu konvertieren, wie es sein sollte. Ich bin nicht auf Ihren Algorithmus eingegangen, weil seine Logik für mich nicht nachvollziehbar ist.

 
Nikolai Semko:

Peter, ich möchte keine 256 Kombinationen von drei Farbziffern in der Ausschreibung haben. Ich brauche Farbe. Alles, was ich in Ihrer Funktion getan habe, war, die Farbe in uint zu konvertieren, anstatt in string, wie es sein sollte. Ich habe mich nicht mit Ihrem Algorithmus befasst, da seine Logik für mich nicht nachvollziehbar ist.

Die Kontrolle nach Zahlen ist am besten. Sie können Farbtöne nicht mit dem Auge vergleichen. Monitore sind unterschiedlich und die Wahrnehmung kann unterschiedlich sein. Deshalb sind Zahlen die beste Kontrolle.

Und es ist keine übermäßige Logik im Spiel. Trigonometrie in der Schule.

1. Berechnen Sie die Winkel von sechs Segmenten.

2. Berechnen Sie dann die Werte an jedem Punkt dieser Segmente und schreiben Sie sie in ein Array.

Das war's.

 
Реter Konow:

Am besten ist es, die Zahlen zu überprüfen. Man kann Farbnuancen nicht genau mit dem Auge vergleichen. Monitore sind unterschiedlich und die Wahrnehmung kann unterschiedlich sein. Deshalb sind Zahlen die beste Kontrolle.

Und es ist keine übermäßige Logik im Spiel. Trigonometrie in der Schule.

1. Berechnen Sie die Winkel von sechs Segmenten.

2. Berechnen Sie dann die Werte an jedem Punkt dieser Segmente und schreiben Sie sie in ein Array.

Das war's.

Tatsächlich funktioniert meine Funktion aber einwandfrei und ist viermal schneller. Ich warte auf Ihr Ergebnis, wenn Sie Ihren Algorithmus zu 5. Ich habe für das Kopieren über die Zwischenablage eine Weile gebraucht, und Sie haben etwas länger gebraucht.

 
Nikolai Semko:

Tatsächlich funktioniert meine Funktion aber einwandfrei und ist viermal schneller. Ich warte auf Ihr Ergebnis, wenn Sie Ihren Algorithmus zu 5. Ich habe eine Weile gebraucht, um einfach über die Zwischenablage zu kopieren, und Sie haben etwas länger gebraucht.

Nikolai, das klingt wie im Kindergarten. Die Aussage "4-mal schneller" ist ungültig, weil sie nicht bewiesen ist.


  1. Kommentieren Sie die Zeile in Ihrer Version meiner Lösung auf MT5 aus und Sie werden den Unterschied sehen.

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

Diese Linie wirkt sich aus irgendeinem Grund auf die Zeichnung des gesamten Rechtecks aus. Aber es ist nicht meine Panne. Sehen Sie sich das an.

Ich werde mich weiter um die Probleme kümmern, die Sie haben. Ich möchte sehen, ob es wirklich an meinem Algorithmus liegt.


Und schalten Sie das unnötige Flackern der Zahlen aus. Entfernen Sie alles Unnötige. Lassen Sie ein einfaches Rechteck mit einem Farbverlauf in einer Ausgangsfarbe einmal anzeigen. Ohne unnötigen Schnickschnack.

 
Im Allgemeinen ist die Funktion zur Ermittlung eines Arrays von Farbverläufen zwischen zwei Farben nützlicher. Denn sie ist einfacher und in der Praxis nützlicher.
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;
     }
  }

Wenn Sie einen Farbverlauf von einer Farbe zu Weiß oder zu Schwarz benötigen, können Sie ihn mit dieser Funktion erstellen.

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


Dateien:
 
Реter Konow:

Am besten ist es, die Zahlen zu überprüfen. Man kann Farbnuancen nicht genau mit dem Auge vergleichen. Monitore sind unterschiedlich und die Wahrnehmung kann unterschiedlich sein. Deshalb sind Zahlen die beste Kontrolle.

Ich schließe mich den "Anschuldigungen" an, ich konnte es nicht ertragen :)

Ein gutes Beispiel dafür, wie man nicht programmieren sollte. Wenn Ihre gesamte grafische Benutzeroberfläche auf diese Weise geschrieben ist, werden wir sie lange Zeit nicht mehr sehen. :(

Jede Zeile ist ein "Meisterwerk": ein solcher Haufen von Fehlern und Patzern, so viel Hoffnung, dass mql4 funktionieren wird. Ich verstehe jetzt, warum mt4 verwendet wird.

Ich bin der Meinung, dass die Veröffentlichung solcher Codes und die anschließende Reaktion auf die Kritik dem Publikum des Forums nicht gerecht wird. Sie wollen dir nicht schaden, sondern dir helfen.

Der Vergleich von Algorithmen kann visuell erfolgen. Sie haben ja nicht mit Zahlen bewiesen, dass Ihr Algorithmus Farbtöne liefert, die zu 99 % den "Fensterfarbtönen" entsprechen.

Auf der linken Seite ist Ihr Ansatz, auf der rechten Seite der vonNikolai Semko. (Es wurde ein modifiziertes Skriptvon Nikolai Semko verwendet)


Dateien:
Grund der Beschwerde: