2016-04-28 7 views
0

Hat jemand einen Code, um einen glatten Kuchen auf einer Leinwand in Delphi zu zeichnen?Delphi, das eine glatte Torte zeichnet

Alles, was ich im Internet finden konnte, sind Beispiele für glatte Linien, aber das hilft mir nicht viel ... Auch ich dachte Gr32, aber für was ich brauche, fügt es einen ziemlich großen Fußabdruck zu meiner App. Ich brauche nur eine gefüllte Torte auf einer Leinwand zu zeichnen, die nicht so schrecklich sehen, wie es mit dem Standard-

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

tut verwende ich Delphi XE, so dass keine Firemonkey ...

EDIT enter image description here

der Kuchen auf der linken Seite wird nach Ihrer Empfehlung erhalten Sie den folgenden Code @johan mit:

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; 

Dank

Antwort

0

Für Zeichnung ein Anti-Aliasing Sie verwenden können: synopse GDIPlus Bibliothek finden Sie unter: http://synopse.info/fossil/wiki?name=GDI%2B

Hier ist ein Beispiel:

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; 

dieses Gerät verwenden Sie nur in diesem einzigen Gerät ziehen, nichts mehr.
Sie müssen keine Metadatei verwenden, Sie können auch direkt auf eine DC zeichnen, intern verwendet SynGDIPlus jedoch eine Metadatei.

schnellere Alternative
Wenn die Leistung ist ein Problem der Graphics32 Bibliothek wird viel schneller sein.

Ich denke, dass Sie viel zu viel über den Fußabdruck von graphics32 sorgen.

+0

Leider ist dies nicht das, was ich brauchte. Der Kuchen auf der Leinwand ist eckig ... nicht glatt. Ich brauche eine Zeichenfunktion, die glatte Kanten hat. Bitte überprüfen Sie das Bild, das ich zu der Frage hinzugefügt habe – user1137313

+0

Was Sie glatt nennen der Rest der Welt ruft Anti-Aliasing. Genau das bietet meine Antwort. .Net tut dies, indem es GDI + verwendet, was wiederum genau das ist, was der verknüpfte Code in der Antwort bietet. – Johan

+0

Ok, warum zeigt das obige Bild einen Kuchen, der mit Ihrem Code gezeichnet wurde und nicht mit Antialiasing versehen ist? Es scheint, dass die Antialias-Zeichnung getan wird, NACHDEM der Kuchen gezeichnet wurde ... Ich habe gerade den Pinsel-Stil in den Code geändert und die Größe geändert, und der Kuchen sieht wie der linke (im obigen Bild) aus sollte wie der in der rechten aussehen – user1137313

2

Dies könnte leicht mit GDI + getan werden. Der Schlüssel wird mit 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; 

Getestet mit Delphi5

output