Функция разложения цвета на оттенки. - страница 9

 
Nikolai Semko:

Петр, вопрос в том, что ты на форуме выложил функцию для всеобщего обозрения и применения разложение цвета. Но эта фукция не формирует нужный массив color, а лишь массив string, который годиться только для вывода Print, вместо того чтобы свой градиент продемонстрировать на экране. Это кот в мешке и не уважение к окружающим. Мол переводите сами, если кому нужно.

Это уже откровенная клевета и отсебятина. Тип string я выбрал сознательно, для того чтобы легче было видеть компоненты и вычленять их. Я подробно объяснил технику моего решения на первой страницы. Ты не объяснил ничего. Не уверен, что ты сам до конца понимаешь, как работает твой способ разложения цвета. Если это не так, объясни его также подробно как и я. 

И не делай столь громких обвинений. Можешь сильно на них сам подскользнуться.

 
И не уводи в ссору. Давай до конца разберемся.
 
Реter Konow:

Это уже откровенная клевета и отсебятина. Тип string я выбрал сознательно, для того чтобы легче было видеть компоненты и вычленять их. Я подробно объяснил технику моего решения на первой страницы. Ты не объяснил ничего. Не уверен, что ты сам до конца понимаешь, как работает твой способ разложения цвета. Если это не так, объясни его также подробно как и я. 

И не делай столь громких обвинений. Можешь сильно на них сам подскользнуться.

Прости - только сейчас прочитал твое обяснение:

  • Сначала, я раскладывал цвет на три основных компоненты, определяя старшую, среднюю, младшую. 
  • Далее, начал строить графики и проводить линии через значения компонент. 
  • Наблюдая изменения цифр в палитре при перетаскивании ползунка, я понял, что существует преломление угла восхождения линий, потому как в определенный момент скорость изменения цифр менялась.
  • Я установил ось преломления линий в центр графика, и увидел, что каждая линия, состоит из двух отрезков, каждый из которых имеет свой угол восхождения.
  • Также, эксперементируя с цветовой палитрой, я понял что есть максимальный угол восхождения старшей компоненты. Сначала я считал, что он равен 67.5 градусов. Однако, практика показала что он равен 63.5 градусов.
  • В течении длительного времени, я не мог понять как правильно составить график отрезков линий цветовых компонент. Было много неизвестных. Но главное, - как найти координату исходного цвета на графике?
  • Продолжая эксперементировать с палитрой, я заметил, что меняя значение цвета на определенное число, ползунок сдвигается на определенное растояние. Постепенно, я понял что расстояние сдвига ползунка, равно половине значения младшей компоненты. 
  • Я предположил, что если найти координату старшей компоненты на линии угла максимального восхождения и прибавлю к этой точке половину значения младшей компоненты, я найду координату исходного цвета на графике. Практика доказала, что предположение было верным.
  • Имея координату исходного цвета и ось преломления, я мог расчитать углы каждого из отрезков и получить значения для каждой компоненты на протяжении ее линии. Для этого воспользовался школьной тригонометрией. 

Я так не смогу. У меня все более прозаичнее и примитивней.
Более емко, чем сам код, объяснить трудно:

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:


Еще раз:

  • Возьми мой алгоритм таким, каким я его создал. Без своих коррекций. 
  • Установи свой цвет. Запусти скрипт на МТ4. 
  • Ты получишь все цвета через алерт. 
  • Введи исходный цвет в палитру виндоус.
  • Проверь соответствие.

Это лучшая проверка правильности работы алгоритма. 

Потом, можно перейти к проверке скорости.

Ты же, взял мой алгоритм, поменял в нем строки по своему усмотрению, потом запустил его на другой платформе и вывел на экран по своей технике рисования. Сделав столько самостоятельных изменений, ты судишь о моем алгоритме так, как будто не замечаешь, как сам его изменил и поставил в другие условия. Условия, где у тебя самого может быть ошибка. Поэтому, давай спокойно выясним.

 
Реter Konow:

Еще раз:

  • Возьми мой алгоритм таким, каким я его создал. Без своих коррекций. 
  • Установи свой цвет. Запусти скрипт на МТ4. 
  • Ты получишь все цвета через алерт. 
  • Введи исходный цвет в палитру виндоус.
  • Проверь соответствие.

Это лучшая проверка правильности работы алгоритма. 

Потом, можно перейти к проверке скорости.

Ты же, взял мой алгоритм, поменял в нем строки по своему усмотрению, потом запустил его на другой платформе и вывел на экран по своей технике рисования. Сделав столько самостоятельных изменений, ты судишь о моем алгоритме так, как будто не замечаешь, как сам его изменил и поставил в другие условия. Условия, где у тебя самого может быть ошибка. Поэтому, давай спокойно выясним.

Петр, да не нужны мне цвета в алерте в виде 256 сочетаний трех цифр. Мне цвет нужен. Все что я сделал в твоей функции, это только вместо стринга цвет перевел в uint, как и должно быть. В алгорим твой я не влазил, так как логика его для меня запредельная.

 
Nikolai Semko:

Петр, да не нужны мне цвета в алерте в виде 256 сочетаний трех цифр. Мне цвет нужен. Все что я сделал в твоей функции, это только вместо стринга цвет перевел в uint, как и должно быть. В алгорим твой я не влазил, так как логика его для меня запредельная.

Проверка по цифрам - лучшая. Оттенки цвета на глаз точно не сравнишь. Тут мониторы разные и восприятие может быть разным. Поэтому цифры - лучшая проверка.

И никакой запредельной логики там нет. Школьная тригонометрия.

1. Нужно вычислить углы шести отрезков.

2. Потом, вычислить значения в каждой точке этих отрезков и записать в массив.

Все.

 
Реter Konow:

Проверка по цифрам - лучшая. Оттенки цвета на глаз точно не сравнишь. Тут мониторы разные и восприятие может быть разным. Поэтому цифры - лучшая проверка.

И никакой запредельной логики там нет. Школьная тригонометрия.

1. Нужно вычислить углы шести отрезков.

2. Потом, вычислить значения в каждой точке этих отрезков и записать в массив.

Все.

Но по факту-то моя функция работает без глюков и быстрее в 4 раза. Жду твоего результата, когда предоставишь свой алгоритм на 5-ке. У меня это заняло время на простое копирование через буфер обмена, а у тебя что-то затянулось.

 
Nikolai Semko:

Но по факту-то моя функция работает без глюков и быстрее в 4 раза. Жду твоего результата, когда предоставишь свой алгоритм на 5-ке. У меня это заняло время на простое копирование через буфер обмена, а у тебя что-то затянулось.

Николай, это похоже на детский сад. Заявление "в 4 раза быстрее" не состоятельно, потому что не доказано. 


  1. Закомментируй строку у себя, в твоей версии моего решения на МТ5, и ты увидешь разницу.

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

 Эта строка почему то влияет на рисование всего прямоугольника. Но это не мой глюк. Проверь.

Продолжаю разбираться в тех глюках, которые у тебя появились. Хочу понять, действильно ли они из за моего алгоритма.


И отключи ненужное мелькание цифр. Убери все лишнее. Пусть один раз выводится простой прямоугольник с градиентом одного исходного цвета. Без лишних примочек.

 
Вообще говоря, более нужной является  функция получения массива градиентов между двумя цветами. Так как это проще и на практике это нужнее.
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;
     }
  }

Если нужен градиент одного цвета до белого или до черного, то можно получить их таким образом с помощью этой функции.

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


Файлы:
 
Реter Konow:

Проверка по цифрам - лучшая. Оттенки цвета на глаз точно не сравнишь. Тут мониторы разные и восприятие может быть разным. Поэтому цифры - лучшая проверка.

Присоединюсь к "обвинениям", не выдержал :)

Хороший пример - как не надо программировать. Если таким образом написан весь ваш ГУИ, то мы нескоро его увидим. :(

Что ни строчка, то "шедевр": такое нагромождение ошибок и ляпов, одна надежда, что mql4 вывезет. Теперь стало понятно почему используется мт4.

Публикация таких кодов, и последующая реакция на критику, думаю это не уважение к аудитории форума. Вам не хотят зла - вам хотят помочь.

А по поводу сравнения алгоритмов, то можно сравнить и визуально. Вы же не предложили доказательства в цифрах, что ваш алгоритм дает оттенки на 99% близкие к "виндоус оттенкам".

Слева - как бы ваш подход, справа - Nikolai Semko. (Использован модифицированный скрипт  Nikolai Semko)


Файлы:
Причина обращения: