Добавление эффекта объёма для линий индикатора - страница 4

 
barabashkakvn:
Точки нарисовались без сглаживания. Я ведь специально выбрал метод PixelSetAA - рисование точки со сглаживанием.

Попробуйте нарисовать линию используя PixelSetAA.

Метод PolylineAA использует метод LineAA. Метод LineAA использует метод PixelSetAA. Нарисовав одну точку вы не увидите эффект сглаживания.

 
tol64:
Попробуйте нарисовать линию используя PixelSetAA.

Неа. Нет эффекта. Нет возле точек сглаживания. Острые углы - как кирпичи:

Линия точками через PixelSetAA 

 
barabashkakvn:

Неа. Нет эффекта. Нет возле точек сглаживания. Острые углы - как кирпичи: 

Я дополнил предыдущее сообщение. Обратите внимание, как реализованы указанные методы и используйте их, если нужно сглаживание.
 
tol64:
Я дополнил предыдущее сообщение. Обратите внимание, как реализованы указанные методы и используйте их, если нужно сглаживание.
Я пока не трогаю метод рисования линии со сглаживанием - PolylineAA. Я хочу понять то, что указано в справке о PixelSetAA:
PixelSetAA -  Рисует точку с использованием алгоритма сглаживания.

Раз этот метод рисует точку со сглаживанием, значит я должен получить вот примерно такую картинку, если нарисую несколько точек подряд:

 Я думаю так должны выглядеть много точек со сглаживанием

Но я не получаю сглаживания точек. 

 
barabashkakvn:
Я пока не трогаю метод рисования линии со сглаживанием - PolylineAA. Я хочу понять то, что указано в справке о PixelSetAA:
PixelSetAA -  Рисует точку с использованием алгоритма сглаживания.

Раз этот метод рисует точку со сглаживанием, значит я должен получить вот примерно такую картинку, если нарисую несколько точек подряд: 

Но я не получаю сглаживания точек. 

Поэтому и предлагаю сравнить код методов с антиалиасингом и аналогичные без него. Код ведь открыт для изучения.

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

Можно даже статью на эту тему написать. Сам бы с удовольствием почитал. )

 
Точку нельзя сгладить, это же в каком-то смысле "элементарная частица" )
 
komposter:
Точку нельзя сгладить, это же в каком-то смысле "элементарная частица" )
Так вот поэтому и вопрос: есть два метода (PixelSet и PixelSetAA). Очень интересует как-раз PixelSetAA - может я что-то не понимаю как работает сглаживание точки?
 
barabashkakvn:
Так вот поэтому и вопрос: есть два метода (PixelSet и PixelSetAA). Очень интересует как-раз PixelSetAA - может я что-то не понимаю как работает сглаживание точки?

Если ничего не помогает, читайте справку ;)

PixelSet просто устанавливает цвет точки. 

 

 
Справку мы читаем. И поэтому вопрос: "PixelSetAA должен рисовать даже единичную точку с использованием сглаживания?". Хочу услышать мнение.
 
barabashkakvn:
Справку мы читаем. И поэтому вопрос: "PixelSetAA должен рисовать даже единичную точку с использованием сглаживания?". Хочу услышать мнение.

DВ общем ответ такой: метод  PixelSetAA должен рисовать даже единичную точку  с использованием сглаживания и этот метод таки рисует эту единичную точку с использованием сглаживания. Для этого пришлось заглянуть в код класса CCanvas:

//+------------------------------------------------------------------+
//| Draw pixel with antialiasing                                     |
//+------------------------------------------------------------------+
void CCanvas::PixelSetAA(const double x,const double y,const uint clr)
  {
   static double rr[4];
   static int    xx[4];
   static int    yy[4];
//--- preliminary calculations
   int    ix=(int)MathRound(x);
   int    iy=(int)MathRound(y);
   double rrr=0;
   double k;
   double dx=x-ix;
   double dy=y-iy;
   uchar  a,r,g,b;
   uint   c;
//--- no need for anti-aliasing
   if(dx==0.0 && dy==0.0)
     {
      PixelSet(ix,iy,clr);
      return;
     }
//--- prepare array of pixels
   xx[0]=xx[2]=ix;
   yy[0]=yy[1]=iy;
   if(dx<0.0)
      xx[1]=xx[3]=ix-1;
   if(dx==0.0)
      xx[1]=xx[3]=ix;
   if(dx>0.0)
      xx[1]=xx[3]=ix+1;
   if(dy<0.0)
      yy[2]=yy[2]=iy-1;
   if(dy==0.0)
      yy[2]=yy[2]=iy;
   if(dy>0.0)
      yy[2]=yy[2]=iy+1;
//--- calculate radii and sum of their squares
   for(int i=0;i<4;i++)
     {
      dx=xx[i]-x;
      dy=yy[i]-y;
      rr[i]=1/(dx*dx+dy*dy);
      rrr+=rr[i];
     }
//--- draw pixels
   for(int i=0;i<4;i++)
     {
      k=rr[i]/rrr;
      c=PixelGet(xx[i],yy[i]);
      a=(uchar)(k*GETRGBA(clr)+(1-k)*GETRGBA(c));
      r=(uchar)(k*GETRGBR(clr)+(1-k)*GETRGBR(c));
      g=(uchar)(k*GETRGBG(clr)+(1-k)*GETRGBG(c));
      b=(uchar)(k*GETRGBB(clr)+(1-k)*GETRGBB(c));
      PixelSet(xx[i],yy[i],ARGB(a,r,g,b));
     }
  }

 и понять, что сглаживание появляется только если передавать в качестве координат число типа double, к тому же не округлённое значение, а с "хвостиком". Что-то вроде 200.4; 125.6; 200.7

Вот парабола нарисованная точками через метод PixelSetAA и она таки стала рисоваться со сглаживанием:

Парабола нарисованная точками через метод PixelSetAA и она таки стала рисоваться со сглаживанием 

Файлы: