Плавное изменения цвета по ADX ..КАК ето реализовать ?? - страница 5

 
Integer:
Может хватит нести чушь?


Может хватит цепляться? Как форум ни читаешь, вечно интересные, любопытные диалоги заканчиваются вот такими склоками. Принято у вас так чтоли, мысли флудом разбавлять? Вот скрин:

 

Нижний, с вертикальным смещением 0, это

color HSLtoRGB(double aH,double aS,double aL){
        if(aS==0){
                int oR=aL*255;
                int oG=aL*255;
                int oB=aL*255;
        }else{
                double Q;
                if(aL<0.5) Q=aL*(1.0+aS); else Q=(aL+aS)-(aS*aL);
                double P=2.0*aL-Q;
                oR=255.0*Hue_To_RGB(P,Q,aH+(1.0/3.0));
                oG=255.0*Hue_To_RGB(P,Q,aH);
                oB=255.0*Hue_To_RGB(P,Q,aH-(1.0/3.0));
        }
        return(0x100*0x100*oB+0x100*oG+oR);
}

 а верхний, с вертикальным смещением 120, это

color HSLtoRGB(double aH,double aS,double aL){
        if(aS==0){
                double oR=aL*255;
                double oG=aL*255;
                double oB=aL*255;
        }else{
                double Q;
                if(aL<0.5) Q=aL*(1.0+aS); else Q=(aL+aS)-(aS*aL);
                double P=2.0*aL-Q;
                oR=255.0*Hue_To_RGB(P,Q,aH+(1.0/3.0));
                oG=255.0*Hue_To_RGB(P,Q,aH);
                oB=255.0*Hue_To_RGB(P,Q,aH-(1.0/3.0));
        }
        return(0x100*0x100*oB+0x100*oG+oR);
}

 с остальными неизменными входными параметрами. Соответственно в первом, нижнем случае, это аналог

void HSLtoRGB(double aH,double aS,double aL,int  &oR,int  &oG,int  &oB)

 а во втором, верхнем случае, это аналог

void HSLtoRGB(double aH,double aS,double aL,double  &oR,double  &oG,double  &oB)

 Код скрипта вон, выше, что ещё. Или это у меня язык по натуре такой кондовый, что остаюсь непонятым?

 
gyfto:


Может хватит цепляться? Как форум ни читаешь, вечно интересные, любопытные диалоги заканчиваются вот такими склоками. Принято у вас так чтоли, мысли флудом разбавлять? Вот скрин:

 

Нижний, с вертикальным смещением 0, это

 а верхний, с вертикальным смещением 120, это

 с остальными неизменными входными параметрами. Соответственно в первом, нижнем случае, это аналог

 а во втором, верхнем случае, это аналог

 Код скрипта вон, выше, что ещё. Или это у меня язык по натуре такой кондовый, что остаюсь непонятым?



Да да, что не посмотришь на этом форуме, та у всех и каждого окружающий мир такой кривой. Проверил и со своими функциями, и с функциями из этой темы. Так что может нефик на мир пенять коли руки кривы?
 
gyfto:


 Или это у меня язык по натуре такой кондовый, что остаюсь непонятым?


Абсолютно верно. Взял функции из того кривового скрипта, и почему-то заработало ровно. Свои функции взял, тоже ровно работает. Вообще не вижу ни повода ни причины обвинять окружающий мир в неправильности, кроме как за обилие населяющих его идитов.
 
gyfto, вы здесь по заданию какой-то партии, доказать типа, что типа мои функции работают неправильно? Вот только правильно они работают, просто берешь их, используешь, без всяких хитростей и премудростей и все работает правильно. А как вам так удалось извратиться... невероятно фантастично.
 

По порядку сверху вниз:

color HSLtoRGB(double aH,double aS,double aL)
color HSVtoRGB(double aH,double aS,double aV)

void oHSLtoRGB(double aH,double aS,double aL,double  &oR,double  &oG,double  &oB)
void oHSVtoRGB(double aH,double aS,double aV,double  &oR,double  &oG,double  &oB)
 

Это МТ5. Скрипт при этом такой (красотой кода особо не занимался, извиняюсь):

#property script_show_inputs
#include <IncColors.mqh>
//--- input parameters
input double   Staturation=1.0;
input double   Lightness=0.5;
input int      h=60;
input int      shift=0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double Hue=0;
   double vR, vG, vB;
   string name;
   CIColors c;
   datetime Time[256];
   int copied=CopyTime(_Symbol, _Period, 0, 255, Time);
   double Close[256];
   copied=CopyClose(_Symbol, _Period, 0, 255, Close);
   for(int i=0; i<256; i++){
          c.HSLtoRGB(Hue, Staturation, Lightness, vR, vG, vB);//конвертируем цветовую модель HSL в цветовую модель RGB
          color RGB=c.RGBToColor(vR, vG, vB);
          StringConcatenate(name, "dash", shift, "-", Time[i]);//формируем имя линии по совету FAQ      
          ObjectCreate(0, name, OBJ_TREND, 0, Time[i], Close[0]+(shift-h)*_Point, Time[i], Close[0]+(shift+h)*_Point);//создаём OBJ_TREND длинной в толщину одной свечи
          ObjectSetInteger(0, name, OBJPROP_COLOR, RGB);//и меняем цвет OBJ_TREND в зависимости от разности +DI и -DI
          ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID);//а также выполняем следующие перестраховки: это сплошная линия (не пунктирная и прочее)
          ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);//также она имеет ширину 2 пикселя (как и обычная линия цены)
          ObjectSetInteger(0, name, OBJPROP_RAY, false);//и нарисованная трендовая линия это не луч, а отрезок
          Hue+=(1.0/256.0);   
   }
  }
//+------------------------------------------------------------------+

  - решительно ничего не понимаю.

 
Есть только предположение, что причина в MathRound.
 
gyfto:

  - решительно ничего не понимаю.


:) бросайте, не ваше это дело.
 
sergeev:

:) бросайте, не ваше это дело.


Нет, всё понял. Вот варианты выхода из подпрограммы:

return(0x100*0x100*DoubleToInt(oB)+0x100*DoubleToInt(oG)+DoubleToInt(oR));
return(0x100*0x100*MathRound(oB)+0x100*MathRound(oG)+MathRound(oR));
return(0x100*0x100*MathCeil(oB)+0x100*MathCeil(oG)+MathCeil(oR));
return(0x100*0x100*MathFloor(oB)+0x100*MathFloor(oG)+MathFloor(oR));
return(0x100*0x100*oB+0x100*oG+oR);
//конвертацию double в int объявлял так:
int DoubleToInt(double x){return(x);}

 И вот в том же порядке получившиеся варианты:

 

Вывод: это было влияние суммирования дробных частей double, а выбор конкретной функции округления на таком масштабе значения не имеет - любая подойдёт.

Я же говорил - неграмотный я, поэтому самоучка до мозга костей. Хорошая между прочим подборочка получилась вариантов работы с цветом в этой ветке))) Автору ветки спасибо за её создание. Но помогать я больше никому не буду.

 

Попробуйте в последнем варианте на первое место даблы поставить.

return(oB*0x100*0x100+oG*0x100+oR); 

Проблема в том, что даблы сначала приводтся к инт, а потом выполняется умножение. А надо, чтобы инты привелись к даблам, произошло умножение, а потом приведение к инт. 

Причина обращения: