La funzione di scomporre il colore in sfumature. - pagina 9

 
Nikolai Semko:

Peter, il problema è che hai postato una funzione sul forum perché tutti vedano e applichino la decomposizione dei colori. Ma questa funzione non genera l'array di colori necessario, ma solo un array di stringhe, che è buono solo per l'output di stampa, invece di dimostrare il vostro gradiente sullo schermo. È un pig in a poke e nessun rispetto per gli altri. Potete tradurlo voi stessi se volete.

Questa è già una vera e propria calunnia e diffamazione. Ho scelto deliberatamente il tipo di stringa per rendere più facile vedere i componenti e isolarli. Ho spiegato la mia tecnica di soluzione in dettaglio nella prima pagina. Non hai spiegato nulla. Non sono sicuro che lei stesso comprenda appieno come funziona il suo metodo di decomposizione del colore. Se non lo fai, spiegalo con tanti dettagli come ho fatto io.

E non fare accuse così forti. Può capitare che tu stesso ci scivoli sopra.

 
E non si metta a discutere. Andiamo in fondo a questa storia.
 
Реter Konow:

Questa è una vera e propria calunnia e diffamazione. Ho scelto il tipo di stringa deliberatamente, per rendere più facile vedere i componenti e isolarli. Ho spiegato in dettaglio la tecnica della mia soluzione nella prima pagina. Non avete spiegato nulla. Non sono sicuro che tu stesso capisca bene come funziona il tuo metodo di decomposizione del colore. Se non lo fai, spiegalo in modo così dettagliato come faccio io.

E non fare accuse così forti. Potresti scivolare su di loro tu stesso.

Scusa - ho letto solo ora la tua spiegazione:

  • Per prima cosa, ho scomposto il colore in tre componenti principali, definendo senior, middle, junior.
  • Poi, ho iniziato a fare grafici e a disegnare linee attraverso i valori dei componenti.
  • Mentre guardavo i numeri cambiare nella palette mentre trascinavo il cursore, mi sono reso conto che c'era una rifrazione nell'angolo di salita delle linee, perché ad un certo punto il tasso di cambiamento dei numeri cambiava.
  • Ho messo l'asse di rifrazione delle linee al centro del grafico e ho visto che ogni linea è composta da due segmenti, ognuno con il suo angolo di ascensione.
  • Inoltre, sperimentando con la tavolozza dei colori, mi sono reso conto che c'è un angolo massimo di salita per la componente più alta. All'inizio pensavo fossero 67,5 gradi. Tuttavia, la pratica ha dimostrato che è di 63,5 gradi.
  • Per molto tempo, non sono riuscito a capire come tracciare correttamente i segmenti di linea dei componenti del colore. C'erano molte incognite. Ma la cosa principale - come trovare la coordinata del colore originale sul grafico?
  • Continuando a sperimentare con la palette, ho notato che cambiando il valore del colore di un certo numero, il cursore si spostava di una certa distanza. A poco a poco, ho capito che la distanza in cui il cursore si muove è la metà del valore della componente di basso ordine.
  • Ho supposto che se trovassi la coordinata della componente più alta nella linea di massimo angolo di salita e aggiungessi metà della componente più bassa a quel punto, troverei la coordinata del colore originale nel grafico. La pratica ha dimostrato che l'ipotesi era corretta.
  • Avendo una coordinata del colore iniziale e un asse di rifrazione, potrei calcolare gli angoli di ciascuno dei pezzi e ricevere i valori di ogni componente lungo la sua linea. Ho usato la trigonometria del liceo per questo.

Non posso farlo. È più prosaico e primitivo.
È difficile da spiegare in modo più capiente del codice stesso:

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:


Un'altra volta:

  • Prendete il mio algoritmo come l'ho creato io. Senza le vostre correzioni.
  • Imposta il tuo colore. Esegui lo script su MT4.
  • Avrete tutti i colori attraverso l'allarme.
  • Inserisci il colore originale nella tavolozza di Windows.
  • Controlla la corrispondenza.

Questo è il miglior controllo che l'algoritmo funzioni correttamente.

Poi, si può passare al controllo della velocità.

Tu, invece, hai preso il mio algoritmo, ne hai cambiato le linee a tuo piacimento, poi l'hai eseguito su una piattaforma diversa e l'hai visualizzato secondo la tua tecnica di disegno. Avendo fatto così tanti cambiamenti indipendenti, giudichi il mio algoritmo come se non notassi come tu stesso l'hai cambiato e messo in condizioni diverse. Condizioni in cui voi stessi potreste avere un errore. Quindi, scopriamolo con calma.

 
Реter Konow:

Un'altra volta:

  • Prendete il mio algoritmo come l'ho creato io. Senza le vostre correzioni.
  • Imposta il tuo colore. Esegui lo script su MT4.
  • Avrete tutti i colori attraverso l'allarme.
  • Inserisci il colore originale nella palette delle finestre.
  • Controlla la corrispondenza.

Questo è il miglior controllo che l'algoritmo funzioni correttamente.

Poi, si può passare al controllo della velocità.

Tu, invece, hai preso il mio algoritmo, ne hai cambiato le linee a tuo piacimento, poi l'hai eseguito su una piattaforma diversa e l'hai visualizzato secondo la tua tecnica di disegno. Avendo fatto tanti cambiamenti indipendenti, giudichi il mio algoritmo come se non notassi come tu stesso l'hai cambiato e messo in condizioni diverse. Condizioni in cui voi stessi potreste avere un errore. Quindi, scopriamolo con calma.

Peter, non ho bisogno di 256 combinazioni di tre cifre nel mio allarme. Ho bisogno di colore. Tutto quello che ho fatto nella tua funzione è stato convertire il colore in uint, come dovrebbe essere. Non sono entrato nel suo algoritmo, perché la sua logica va oltre la mia comprensione.

 
Nikolai Semko:

Peter, non voglio 256 combinazioni di tre cifre di colore in un avviso. Ho bisogno di colore. Tutto quello che ho fatto nella tua funzione è stato convertire il colore in uint invece che in stringa, come dovrebbe essere. Non sono entrato nel suo algoritmo, perché la sua logica va oltre la mia comprensione.

Il controllo con i numeri è il migliore. Non si possono confrontare le sfumature di colore a occhio. I monitor sono diversi e la percezione può essere diversa. Ecco perché le cifre sono il miglior controllo.

E non c'è una logica smodata. Trigonometria scolastica.

1. Calcola gli angoli di sei segmenti.

2. Poi, calcola i valori in ogni punto di questi segmenti e scrivili in una matrice.

Questo è tutto.

 
Реter Konow:

Il controllo con i numeri è il migliore. Non si possono esattamente confrontare le sfumature di colore a occhio. I monitor sono diversi e la percezione può essere diversa. Ecco perché i numeri sono il miglior controllo.

E non c'è una logica smodata. Trigonometria scolastica.

1. Calcola gli angoli di sei segmenti.

2. Poi, calcola i valori in ogni punto di questi segmenti e scrivili in una matrice.

Questo è tutto.

Ma in effetti, la mia funzione funziona senza glitch ed è 4 volte più veloce. Sto aspettando il tuo risultato quando fornirai il tuo algoritmo il 5. Io ci ho messo un po' solo a copiare tramite gli appunti, e tu ci hai messo qualcosa di più.

 
Nikolai Semko:

Ma in effetti la mia funzione funziona senza glitch ed è 4 volte più veloce. Sto aspettando il tuo risultato, quando fornirai il tuo algoritmo del 5. Io ci ho messo un po' a copiare semplicemente attraverso gli appunti, e tu ci hai messo qualcosa di più.

Nikolai, sembra di stare all'asilo. L'affermazione "4 volte più veloce" non è valida perché non è dimostrata.


  1. Commentate la linea nella vostra versione della mia soluzione su MT5 e vedrete la differenza.

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

Questa linea influisce sul disegno dell'intero rettangolo per qualche motivo. Ma non è il mio difetto. Guarda qui.

Continuando a cercare quei glitch che hai. Voglio vedere se è davvero a causa del mio algoritmo.


E spegni l'inutile sfarfallio dei numeri. Togliete tutte le cose inutili. Lasciate che un semplice rettangolo con un gradiente di un colore originale sia visualizzato una volta. Senza nessun espediente inutile.

 
In generale, la funzione per ottenere un array di gradienti tra due colori è più utile. Poiché è più semplice e più utile nella pratica.
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;
     }
  }

Se avete bisogno di un gradiente da un colore al bianco o al nero, potete ottenerlo con questa funzione.

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


File:
 
Реter Konow:

Il controllo con i numeri è il migliore. Non si possono esattamente confrontare le sfumature di colore a occhio. I monitor sono diversi e la percezione può essere diversa. Ecco perché i numeri sono il miglior controllo.

Mi unisco alle "accuse", non potevo prenderlo :)

Un buon esempio di come non programmare. Se questo è il modo in cui l'intera GUI è scritta, non la vedremo per molto tempo. :(

Ogni riga è un "capolavoro": un tale mucchio di errori e bloopers, tanta speranza che mql4 funzioni. Ora capisco perché si usa mt4.

Penso che la pubblicazione di tali codici e la successiva reazione alle critiche non sia rispettosa del pubblico del forum. Non vogliono farvi del male, vogliono aiutarvi.

Per quanto riguarda il confronto degli algoritmi, è possibile confrontarli visivamente. Non è che tu abbia offerto la prova in numeri che il tuo algoritmo dà sfumature al 99% vicine alle "sfumature delle finestre".

A sinistra c'è più o meno il tuo approccio, a destraquello di Nikolai Semko. (È stato usato uno script diNikolai Semko modificato)


File: