Entwickler-Ecke

Multimedia / Grafik - ... geglättete, dicke Linien zeichnen


delfiphan - Do 25.08.05 22:59
Titel: ... geglättete, dicke Linien zeichnen
Geglättete, dicke Linien zeichnen
Auf Anfrage eines DF-Mitglieds habe ich eine kleine Klasse (TPaintBoxEx) geschrieben, welche ähnlich wie TPaintBox ist. Auf Anfrage eines anderen DF-Mitglieds veröffentliche ich die Routinen hier.

Im Gegensatz zu TPaintBox wird das gezeichnete Bild bei TPaintBoxEx gepuffert und flimmerfrei angezeigt. Die Komponente ist fokusierbar und enthält einige Zeichenroutinen wie DrawLineAA (zeichnen von geglätteten Linien) und schneller Pixel-Zugriff via Pixels[].

Nach einem Zugriff auf TPaintBoxEx ist stets ein Invalidate (bzw. Repaint) erforderlich, um das Bild zu aktualisieren.

Das ganze ist nicht so sauber programmiert, wie es sein könnte; für die meisten Zwecke sollte es aber eigentlich reichen.

Beispiel 1 (geglättete, dicke Linien Zeichnen -- siehe Screenshot):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
const
 N = 24;
var
 I: Integer;
 p: Single;
begin
  for I := 0 to N-1 do
   with PaintBox1, CanvasBuffer do
   begin
    p := I/N*pi*2;
    Pen.Style := psDot;
    Pen.Color := clBlue;
    Pen.Width := 2;
    DrawLineAA(20*cos(p)+200,20*sin(p)+200,200*cos(p)+200,200*sin(p)+200);
    Pen.Style := psDashDotDot;
    Pen.Color := clRed;
    Pen.Width := 8;
    DrawLineAA(20*cos(p)+250,20*sin(p)+200,200*cos(p)+250,200*sin(p)+200);
  end;
  PaintBox1.Invalidate;
end;


Beispiel 2 (schneller Pixel-Zugriff):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 x, y: Integer;
begin
  // Zeichnet ein rotes Sierpinskidreieck
  with PaintBoxEx1 do
   for y := 0 to 255 do
    for x := 0 to 255 do
      Pixels[x,y] := Ord(x and y = 0)*clRed;

  // Bild aktualisieren
  PaintBoxEx1.Invalidate;
end;


Siehe auch: Hier [http://www.delphi-forum.de/viewtopic.php?t=37751&highlight=] ist ein alter Post mit einer anderen Routine für geglättete Linien.
Die Linienroutinen basieren auf Ausführungen von dieser Seite [http://homepages.enterprise.net/murphy/thickline/].

//Edit: Exe entfernt, Beispiele und Erläuterungen hinzugefügt.