Autor Beitrag
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 25.08.05 22:59 
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):
ausblenden 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):
ausblenden 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 ist ein alter Post mit einer anderen Routine für geglättete Linien.
Die Linienroutinen basieren auf Ausführungen von dieser Seite.

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


Line.png  (39.4 KB) Download (Rev 0)
 (1178x, 1178x gesamt)
Beschreibung: Screenshot
source.zip  (3.96 KB) Download (Rev 0)
 (978x, 978x gesamt)
Beschreibung: Source


Zuletzt bearbeitet von delfiphan am Fr 26.08.05 01:24, insgesamt 5-mal bearbeitet