Kann ich Linien mit glatten Kanten zeichnen? (Antialiasing)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Kann ich Linien mit glatten Kanten zeichnen? (Antialiasing)

Beitrag von 400kmh »

Hallo,

mit "Canvas.Line" kann ich Linien zeichnen. Jedoch sind diese Linien nicht kantengeglättet.

Gibt es eine Möglichkeit Linien mit geglätteten Kanten zu zeichenen?

Ich hatte das vor einigen Jahren in Free Pascal schon mal selbst programmiert, indem ich bei jedem Pixel geprüft habe, ob er sich in einem Abstand < 0.5 zum Rande der zu zeichnenden Linie befindet, und falls ja ihm eine dem genauen Abstand zum Linienrand entsprechende Farbintentensität gegeben habe, wobei ich das mit der vorherigen Farbe des Pixels verrechnet habe. Hat alles korrekt ausgesehen, nur hat die Zeichnung viel zu lange gedauert (ingesamt ein 3-5 Sekunden für vielleicht 100 Linien). Jetzt brauche ich sowas sehr häufig in der Sekunde, und dafür dauert das viel zu lang. Aber eigentlich müsste es da doch eine vorgefertigte schnellere Lösung geben, oder?

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Kann ich Linien mit glatten Kanten zeichnen? (Antialiasi

Beitrag von theo »

http://wiki.freepascal.org/Developing_w ... 2D_drawing

Ich glaube AggPas kann sowas. Vllt auch BGRABitmap.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Kann ich Linien mit glatten Kanten zeichnen? (Antialiasi

Beitrag von Timm Thaler »

Eine Idee für ein schnelles Antialiasing wäre: Zeichne alles auf ein Image mit 2 oder 3facher Kantenlängen, resize das Image mit Antialiasing und pappe dann das Image auf das Canvas.

So würde ich das in Purebasic machen. Da ich in FreePascal erst einsteige, weiß ich leider nicht, ob es die entsprechenden Funktionen hier gibt.

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kann ich Linien mit glatten Kanten zeichnen? (Antialiasi

Beitrag von Mathias »

Mit BGRABitmap geht es, habe es gerade probiert.

Code: Alles auswählen

uses .... , BGRABitmap;
 
procedure TForm1.FormPaint(Sender: TObject);
var
  img: TBGRABitmap;
begin
  img := TBGRABitmap.Create(ClientWidth, ClientHeight, clWhite);
  img.CanvasBGRA.MoveTo(0, 0);
  img.CanvasBGRA.LineTo(ClientWidth, ClientHeight);
  img.Draw(Canvas, 0, 0);
  img.Free;
  Canvas.Line(10, 0, ClientWidth + 10, ClientHeight);// ohne Antialiasing
end; 
Ein Wermutstropfen hat es aber, man muss die Package BGRABitmap installieren, welche nicht bei Lazarus enthalten ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten