Конференция "Media" » Градиентная заливка [D7, WinXP]
 
  • Юрий__________ (14.03.18 12:04) [0]
    Здравствуйте форумчане,
    необходимо линейным градиентом залить прямоугольник, прямоугольник с скругленными углами, эллипс, трехугольник.

    Прямоугольник я залил. Как залить скажем эллипс?
    Проблема с определением границ заливки.
    Я вижу два варианта : 1. Описать элипс и т.д. математически и
    если точка за пределами фигуры ее не закрашавать.
    2. Закрасить прямоугольник градиентом и каким-то образом вырезать из него нужную фигуру. Как это сделать не знаю.
    3. Может еще есть варианты?
  • RWolf © (14.03.18 12:11) [1]
    ну, Ellipse() в WinAPI есть, дело только за тем, чтобы подобрать маску для его наложения на прямоугольник, заранее закрашенный градиентом.
  • Игорь Шевченко © (14.03.18 13:07) [2]
    SelectClipRgn и прочие фукнции для управления отсечением.

    Туча их:

    https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd183436(v=vs.85).aspx
  • Pavia © (14.03.18 15:04) [3]
  • Pavia © (14.03.18 15:04) [4]
  • Redmond (14.03.18 17:35) [5]
    > Pavia ©   (14.03.18 15:04) [3]

    MacOS..? В теме пометка "WinXP". Может лучше тогда уж лучше отправлять на оригинал?: http://www.antigrain.com/demo/

    Юрий__________, сперва надо определиться что и как именно вы делаете - чем вы пользуетесь, а чем нельзя пользоваться. VCL? WinAPI (GDI, GDI+, под оба)? Прочие сторонние библиотеки? Заливка своим алгоритмом "руками"?
    Хотя одного VCL полагаю не хватит. Так что предварительный ответ:

    1. Описать фигуру математически и закрашивать только если пиксель внутри фигуры - но вы потратите прилично времени чтоб это оптимизировать.
    2. Закрасить прямоугольник градиентом, сделать такого же размера ч/б маску с фигурой - и рисовать куда требуется через битовую маску.
    3. Покорячится с WinAPI функциями для рисования, плюс регионы и GradientFill().
    4. Попробовать через GDI+.
    5. Воспользоваться сторонними библиотеками, которые уже умеют это.
  • Игорь Шевченко © (14.03.18 22:16) [6]
     BeginPath(SomeCanvas.Handle);
     Ellipse(SomeCanvas.Handle, ....);
     EndPath(SomeCanvas.Handle);
     Rgn := PathToRegion(SomeCanvas.Handle);
     SelectClipRgn(SomeCanvas.Handle, Rgn);
     GradientFill(SomeCanvas.Handle, ....);
     SelectClipRgn(SomeCanvas.Handle, 0);
     DeleteObject(Rgn);

  • dmk © (15.03.18 00:30) [7]
    Изучайте вектора.
  • dmk © (15.03.18 00:32) [8]
    По сути внешний контур - это Alpha-маска.
    Закрашиваете прямоугольник, а потом выводите с маской сделанной из контура.
  • dmk © (15.03.18 01:15) [9]
    Вот векторная заливка в 3D:
    https://yadi.sk/i/R2eitAvY3SJRKH
    https://yadi.sk/i/-mirqdnf3TNz3p

    В 2D проще делается.
    Каждая точка считается отдельно.
    Даже вдоль Безье залить можно.
  • Юрий__________ (16.03.18 18:31) [10]
    Спасибо,
    сделал следующим  образом,
    создал BMP в размер моего объекта, закрасил градиентом.
    Затем создал маску и вырезал нужный участок.


    Var
        Reg: hRGN;
        BMP,Fon : TBitMap;

       Begin

       try

        Fon:=TBitMap.Create;
        Fon.Width:=Width;
        Fon.Height:=Height;

        // Создаем второй BMP
        BMP := TBitMap.Create;
        BMP.Width:=Width;
        BMP.Height:=Height;
     

        // Градиентом заливаем объект Fon, цветом clBlue - моя процедура
        GradientBMP(Fon,clBlue);

        // Присваиваем фон
          BMP.Canvas.Brush.Bitmap:=Fon;

       

         // Создаю регион
        Case fTypeFigure of

        Rect :      Reg := CreateRectRgn(0, 0, Width-1, Height-1);
        Elipse :    Reg := CreateEllipticRgn (0, 0, Width-1, Height-1); // Создадим элипс
        RoundRect : Reg := CreateRoundRectRgn(0, 0, Width-1, Height-1,Width div 4,Height div 4);

        end; // Case
       

          // Прорисовываем регион
          PaintRgn (BMP.Canvas.Handle, Reg);

          // Рисуем окантовку региона
          BMP.Canvas.Brush.Color :=fColorPen;
          FrameRgn (BMP.Canvas.Handle, Reg, Bmp.Canvas.Brush.Handle, fWidthPen,fWidthPen);

          BMP.Transparent:=True;

         // Выведем на Канву - Can
         Can.Draw(Left,Top,BMP);

        finally

         Fon.Free;
         BMP.Free;
         DeleteObject (Reg);

        end;


 
Конференция "Media" » Градиентная заливка [D7, WinXP]
Есть новые Нет новых   [118480   +44][b:0][p:0.002]