![]() |
Graph mit Graphics32 Darstellungsproblem
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
in meiner Software zeichne ich Graphen mit Graphics32 (V2), als Pfade (moveTo, lineTo). Bei manchen Kombinationen von Kurvendicke und Abstand der Werte ergibt sich eine sehr komische Darstellung (siehe Anhang). Ich bin da ziemlich ratlos, hat da jemand evtl. einen Tip? Grüße Tomy |
AW: Graph mit Graphics32 Darstellungsproblem
Ich vermute, dass da beim Anti-Aliasing etwas schief läuft. Versuch es mal mit TPolygon32 "am Stück" zu zeichnen - evtl. richt das ja schon als Workaround. Grundsätzlich wäre ein Stück Code aus der Zeichnroutine sehr praktisch um besser helfen zu können.
|
AW: Graph mit Graphics32 Darstellungsproblem
Hi,
erstmal vielen Dank für Deine Antwort. PolyLine gibt's leider nicht in Graphics32 und Polygon ist hier nicht zielführend ..
Code:
Der Aufruf erfolgt wie folgt:
Type TLineData = TArrayOfFloatPoint;
Procedure DoPolyLine(const pfad: GR32_Paths.TFlattenedPath; const data: TLineData; const add: boolean); var maxl: cardinal; i: cardinal; begin if ( Assigned(pfad) and ( Length(data) > 1 ) ) then begin maxl:= High(data); if add then pfad.MoveTo(data[0]) else pfad.LineTo(data[0]); for I := 1 to maxl do pfad.LineTo(data[i]); end; end;
Code:
Procedure OutCan(const daten: TArrayOfFloatPoint; const can: TCanvas32;
const shadow: boolean; const shadowY: single; const tw: integer); inline; var endl: integer; begin endl:= high(daten); if (length(daten) > 0) then begin //Die linie can.Brushes[0].Visible:= TRUE; can.Brushes[1].Visible:= false; can.Path.Clear; can.Path.BeginPath; if (endl > 0) then begin (can.Brushes[0] as TStrokeBrush).StrokeWidth:= tw; DoPolyLine(can.Path, daten, False); end else begin (can.Brushes[0] as TStrokeBrush).StrokeWidth:= tw * 0.5; can.Path.Arc(daten[0], 0, doublePi, 0.25 * tw); end; can.Path.EndPath; //Füllen if Shadow then begin can.Path.Clear; can.Brushes[0].Visible:= FALSE; can.Brushes[1].Visible:= TRUE; //Die Daten dazu can.Path.Clear; can.Path.BeginPath; can.Path.MoveTo(daten[0].x, shadowY); uPaintGr32.DoPolyLine(can.Path, daten, False); can.Path.LineTo(daten[endl].X, shadowY); can.Path.ClosePath; can.Path.EndPath; end; // else can.Brushes[1].Visible:= TRUE; end; end; |
AW: Graph mit Graphics32 Darstellungsproblem
Eine Klasse TCanvas32 kenne ich gar nicht, und habe sie auch in den Docs zur GR32 nicht finden können. Wo kommt die denn her?
Bisher bin ich immer so vorgegangen, dass ich alles auf ein zuvor geleertes Bitmap32 gezeichnet habe, und zum Schluss dann mit TBitmap32.PaintTo() direkt auf einen (konventionellen) Canvas. Bzgl. PolyLine: ![]() ![]() |
AW: Graph mit Graphics32 Darstellungsproblem
Hi,
die Polylines etc. wurde mit der Version 2.0 von Graphics32 geändert. Da wurde der Canvas32 eingeführt (GR32_PATHS, GR32_BRUSCHES etc). Ich zeichne auch auf eine Bitmap32, das ganze wird dann in einer anderen Routine ausgegeben. Tomy |
AW: Graph mit Graphics32 Darstellungsproblem
Wenn ich das richtig erinnere, machen diese Renderer (TPolygonRenderer32) eine Umhüllung der eigentlichen Line (also ein "Hüllpolygon") und füllen es mit Farbe. Ich hatte es schon, dass diese Renderer nicht 100% funktionieren.
Ich vermute also einen Fehler im Renderer. |
AW: Graph mit Graphics32 Darstellungsproblem
Okay, eine Version 2 kenne ich nicht! (Ist mir auf der Projektseite dort auch nirgends begegnet - wo gibt's das denn?) Dann falle ich als "Sachkundiger" leider aus.
|
AW: Graph mit Graphics32 Darstellungsproblem
@Tomy
Versuch doch mal sowas:
Delphi-Quellcode:
var
can: TCanvas32; can.Renderer := TPolygonRenderer32VPR.Create; |
AW: Graph mit Graphics32 Darstellungsproblem
Hallo Tommy,
vermutlich wirst du um eine Strokewidth von 2 nicht herumkommen, sonst verfälscht das Antialias die Farbausgabe. Strichstärken mit nur einem Pixel sind derzeit nicht wirklich möglich oder unschön. Ich arbeite momentan an einer Verfeinerung der Ausgabe, die ich für mein Snap-Grid benötige. Ggf die Spline Routine angreifen... Wenn erfolgreich, richte ich ein Git Repository ein. Schau dir ggf auch mal alternativ die Lösung von AngusJ an ( ![]() |
AW: Graph mit Graphics32 Darstellungsproblem
Hi,
danke für die Infos. Die Ausgabe erfolgt nur mit der Strokebrush (Solidbrush.visible = False), wobei die strokeWidth je nach gewünschter Strichstärke variiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz