Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Graph mit Graphics32 Darstellungsproblem (https://www.delphipraxis.net/199181-graph-mit-graphics32-darstellungsproblem.html)

TomyN 2. Jan 2019 15:04

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

Medium 2. Jan 2019 15:24

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.

TomyN 2. Jan 2019 15:49

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:
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;
Der Aufruf erfolgt wie folgt:

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;

Medium 2. Jan 2019 16:28

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: TPolygon32 hat eine Property "Closed" mit der aus dem Polygon eine PolyLine wird. Zusätzlich gibt es aber auch noch die Funktion Polyline(), der man einfach ein Array von Punkten mit geben kann.

TomyN 2. Jan 2019 16:52

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

Jens01 2. Jan 2019 17:22

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.

Medium 3. Jan 2019 07:20

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.

Jens01 3. Jan 2019 11:53

AW: Graph mit Graphics32 Darstellungsproblem
 
@Tomy
Versuch doch mal sowas:
Delphi-Quellcode:
var
  can: TCanvas32;

  can.Renderer := TPolygonRenderer32VPR.Create;

bytecook 4. Jan 2019 09:19

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 (http://www.angusj.com/delphi/clipper.php).

TomyN 4. Jan 2019 10:52

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.

Jens01 4. Jan 2019 13:41

AW: Graph mit Graphics32 Darstellungsproblem
 
Crosspostings: https://github.com/graphics32/graphics32/issues/45

TomyN 4. Jan 2019 13:43

AW: Graph mit Graphics32 Darstellungsproblem
 
Hi,

ist das nicht okay so?
Ich hatte zuerst an einen Fehler meinerseits gedacht und daher hier nachgefragt. Nun scheint es sich aber (zumindest zum Teil) um ein Problem mit/in Graphics32 zu handeln, daher hab ich dort mal ein Issue aufgemacht.

Tomy

Jens01 4. Jan 2019 14:09

AW: Graph mit Graphics32 Darstellungsproblem
 
Das ist vollkommen okay.
Es ist für alle nur gut zu wissen, welche Lösungsvorschläge es schon gibt. Sonst kommen sie -wie hier- doppelt.
Hast Du versucht, den Renderer zu tauschen?

Jens01 4. Jan 2019 14:47

AW: Graph mit Graphics32 Darstellungsproblem
 
Ich selbst mache das nicht mit diesem TCanvas32, ich benutze den Renderer direkt. Auch für solche (ähnlichen) Polygonlinien. So ein Fehler ist mir nicht aufgefallen.

Hier meins:
Delphi-Quellcode:
procedure TGrafik._DrawLine(pts: TArrayOfFloatPoint; Color: TColor32; Filler: TCustomPolygonFiller);
var
  P: TPolygonRenderer32VPR;
begin
  P := TPolygonRenderer32VPR.Create(FBitmap);
  try
    P.Color := Color;
    P.Filler := Filler;
    P.PolygonFS(pts);
  finally
    P.free;
  end;
end;

Jens01 4. Jan 2019 14:50

AW: Graph mit Graphics32 Darstellungsproblem
 
Sind die Polygonpunkte auch vllt zu eng nebeneinander. Springen sie vllt zurück oder ähnliches.
Ggf müssen die Punkte in der Linie etwas ausgedünnt werden. Also vllt weniger Punkte.

TomyN 4. Jan 2019 15:37

AW: Graph mit Graphics32 Darstellungsproblem
 
Hi,

hier die 'Problemimulation':

https://download.satlive.audio/beta/DrawTest32.zip

Tomy

Jens01 4. Jan 2019 15:50

AW: Graph mit Graphics32 Darstellungsproblem
 
Ich kann da nicht so viel sehen.
Aber ich sehe da nur etwas Falsches bei dicken Linien und vielen Punkten.

Wäre auch ganz logisch. Bei dicken Linien bringen viele Punkte auch gar nichts, da man sie gar nicht auflösen kann. Sie verschwinden innerhalb der Linie. Vermutlich kommt der Algorithmus deshalb damit nicht klar.

TomyN 4. Jan 2019 21:56

AW: Graph mit Graphics32 Darstellungsproblem
 
Über eine Änderung des Parameters Miter-Limit auf 0.1 (Standard 4.0) lässt sich das Problem beheben.

CWBudde 5. Jan 2019 12:12

AW: Graph mit Graphics32 Darstellungsproblem
 
Hallo Tomy,

Bis das Problem beseitigt ist kannst du auch innerhalb der Datei GR32_VectorUtils in der Prozedur AddRoundedJoin den Aufruf AddMitered(...) durch:
Code:
      AddPoint(Delta * X1, Delta * Y1);
      AddPoint(Delta * X2, Delta * Y2);
ersetzen. Das löst das Problem indem keine Spitze mehr eingefügt wird und ist gleichzeitig etwas performanter als die Verwendung eines kleinen Miter Limits.

Aktuell scheue ich noch davor das in der Original-Bibliothek einzusetzen, da Mattias, der Originalentwickler da nun auch aufmerksam drauf wurde und er es ganz sicher besser lösen kann. Da ich mir an der Problematik bereits vor ca. 9 Jahren schon mal die Zähne dran ausgebissen habe, werde ich da jetzt nicht wieder ein großes Fass aufmachen wollen.

TomyN 5. Jan 2019 12:42

AW: Graph mit Graphics32 Darstellungsproblem
 
Hallo Christian,

nochmal vielen Dank an Dich und all die Anderen, die sich da auch den Kopf zerbrechen (und zerbrochen haben). Performance ist kein Thema, die Anwendung dümpelt so mit 5-7% CPU Last vor sich hin, so dass ich das erstmal mit dem Mitter-Limit mache.

Gibt es eigentlich eine Doku zur 2.0 Alpha? Ich schwimme da etwas, nachdem das Zeichnen mit Outline.Grow nicht mehr ist …

Grüße

Tomy


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz