2016-04-28 1 views
0

Есть ли у кого-нибудь код для рисования гладкого пирога на холсте в Delphi?Delphi рисует гладкий пирог

Все, что я мог найти в Интернете, - это примеры гладких линий, но это не очень помогает мне ... Также я рассмотрел Gr32, но для чего мне нужно, это добавляет довольно большой размер для моего приложения. мне просто нужно нарисовать заполненный пирог на холсте, который не выглядит так ужасно, как это делает с я использую Delphi XE, поэтому не FireMonkey по умолчанию

Canvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4); 

...

EDIT enter image description here

пирог слева получается следующая вашей рекомендации @johan, используя следующий код:

procedure TForm1.Button4Click(Sender: TObject); 
var 
    Center:TPoint; 
    Radius:integer; 
    Bmp: TBitmap; 
    MF: TMetaFile; 
    MetafileCanvas: TMetafileCanvas; 
begin 
    MF := TMetaFile.Create; 
    MF.Width := 150; 
    MF.Height := 150; 

    MetafileCanvas := TMetafileCanvas.Create(MF, 0); 
    MetafileCanvas.Pen.Color := clRed; 
    MetafileCanvas.Brush.Color := clRed; 
    MetafileCanvas.Brush.Style := bsSolid; 
    MetafileCanvas.Pie(0,0,150, 150, 150,50, 150,50); 

    MetafileCanvas.Free; 

    Bmp := Gdip.DrawAntiAliased(MF); 
    Image2.Picture.Assign(Bmp); 
    Bmp.Free; 
    MF.Free; 
end; 

Благодаря

ответ

0

Для нанесения сглаживается вы можете использовать: Synopse библиотека gdiplus, см: http://synopse.info/fossil/wiki?name=GDI%2B

Вот пример:

implementation 

uses 
    SynGDIPlus; //provides gdip (see below) 

procedure TForm1.FormResize(Sender: TObject); 
var Bmp: TBitmap; 
    MF: TMetaFile; 
    MetafileCanvas: TMetafileCanvas; 
begin 
    MF := TMetaFile.Create; 
    MF.Width := 300; 
    MF.Height := 200; 

    MetafileCanvas := TMetafileCanvas.Create(MF, 0); 
    MetafileCanvas.Brush.Color := clRed; 
    MetafileCanvas.Brush.Style := bsDiagCross; 
    MetafileCanvas.Pie(0,0,50, 50, 300,50, 200,50); 
    MetafileCanvas.Free; 

    Bmp := Gdip.DrawAntiAliased(MF); 
    Image1.Picture.Assign(Bmp); 
    Bmp.Free; 
    //Image1.Picture.Assign(MF); 

    MF.Free; 
end; 

Использование этого аппарата вы тянуть только в этом одном устройстве, больше ничего.
Вам не нужно использовать метафайл, вы также можете рисовать непосредственно в DC, внутри SynGDIPlus использует метафайл.

Быстрее альтернатива
Если производительность является вопросом библиотека Graphics32 будет намного быстрее.
http://graphics32.org/wiki/

Я думаю, что вы слишком беспокоитесь о следе графики32.

+0

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

+0

То, что вы называете гладким, остальной мир называет сглаженным. Именно это и дает мой ответ. .Net делает это, используя GDI +, что, опять же, является тем, что обеспечивает связанный код в ответе. – Johan

+0

Хорошо, тогда почему изображение выше показывает пирог, нарисованный вашим кодом, который не сглаживается? Кажется, что сглаженный рисунок сделан ПОСЛЕ того, как вырисовывается пирог ... Я просто изменил стиль Brush на твердый в вашем коде и изменил размер, а пирог похож на тот, что находится слева (на изображении выше), когда он должен выглядеть так, как в правом – user1137313

2

Это можно сделать легко с помощью GDI +. Ключ используется SmoothingModeAntiAlias:

uses GDIPAPI, GDIPOBJ; 

procedure TForm1.FormPaint(Sender: TObject); 
var 
    g: TGPGraphics; 
    p: TGPPen; 
    b: TGPBrush; 
    r: TGPRect; 
begin 
    r := MakeRect(10, 10, ClientWidth - 20, ClientHeight - 20); 
    g := TGPGraphics.Create(Canvas.Handle); 
    g.SetSmoothingMode(SmoothingModeAntiAlias); 
    b := TGPSolidBrush.Create(aclGreen); 
    p := TGPPen.Create(aclRed, 1); 
    g.FillPie(b, r, 45, 90); 
    g.DrawPie(p, r, 45, 90); 
    b.Free; 
    p.Free; 
    g.Free; 
end; 

procedure TForm1.FormResize(Sender: TObject); 
begin 
    Invalidate; 
end; 

Испытано с Delphi5

output