AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas.Arc Problem

Ein Thema von DaCoda · begonnen am 19. Sep 2024 · letzter Beitrag vom 21. Sep 2024
Antwort Antwort
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
165 Beiträge
 
Delphi 12 Athens
 
#1

AW: Canvas.Arc Problem

  Alt 19. Sep 2024, 17:33
Vielen Dank Uwe,

Das funktioniert tatsächlich korrekt, wenn Scale = 1.0, 2.0... Also wenn Scale z.B. 2.41 ist, dann malt das DrawArc wieder falsch, wenn Scale "gerade" ist dann stimmt das Ergebnis.
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#2

AW: Canvas.Arc Problem

  Alt 19. Sep 2024, 17:50
Hier ist Scale = 4.67
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
165 Beiträge
 
Delphi 12 Athens
 
#3

AW: Canvas.Arc Problem

  Alt 19. Sep 2024, 17:57
Hallo Uwe,
ja ich teste hier auch gerade. Manche Werte stimmen. Manche eben nicht.
2.41 oder 3.14 z.B. gehen nicht... Nun steh ich wieder blöd da

Vielen Dank für deine Tips, ich finde es toll, das du dir so viel Zeit für dieses Forum nimmst.
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#4

AW: Canvas.Arc Problem

  Alt 19. Sep 2024, 18:57
Ja, das sind die üblichen Probleme, mit denen man sich beim Zeichnen von Bögen herumärgern muss. Ursache sind hier die Fälle, bei denen nach der Umrechnung der Start- und Endkoordinaten von Double nach Integer die Ergebnisse identisch sind. Eigentlich kann man da keinen Bogen malen, aber wenn man es dennoch versucht, macht Windows einen Vollkreis daraus. Bei Linien fällt das halt nicht auf.

Es bleibt also keine Wahl: Man muss erst die Umrechnung machen, dann jeweils die X- und Y-Werte auf Gleichheit prüfen und - falls beide gleich - den Arc-Befehl überspringen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
165 Beiträge
 
Delphi 12 Athens
 
#5

AW: Canvas.Arc Problem

  Alt 20. Sep 2024, 11:31
@Uwe Raabe: Vielen Dank für deine Mühe und Zeit, die du für mich "geopfert" hast!

Ich habe es jetzt erst einmal so weit "fertig". Die Arcs einfach auslassen ist keine schöne Alternative.
Deshalb überlege ich nun, ob ich eventuell mit 3D-Zeichnen direct mit den Gleitkomma-Werten besser beraten bin.
Nur muss ich mir zuerst erst mal klar amchen, womit ich das dann mache (OpenGL, DirectX oder Sonstwas).

FMX wäre eventuell auch brauchbar, aber mein Projekt ist ja VCL und es wäre sehr viel Aufwand alles neu zu machen wegen FMX.

Im Moment muss ich wohl erst einmal viel googlen und schauen was ein guter Ansatz sein könnte...

Auf jeden Fall vielen Dank an Euch für die Hilfe und Tips
Angehängte Grafiken
Dateityp: png B1.png (256,6 KB, 23x aufgerufen)
Dateityp: png B2.png (233,7 KB, 23x aufgerufen)
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#6

AW: Canvas.Arc Problem

  Alt 20. Sep 2024, 12:26
Die Arcs einfach auslassen ist keine schöne Alternative.
Du sollst ja nur die auslassen, die bei der aktuellen Auflösung gar nicht zu sehen wären (konsequenterweise übrigens auch bei Linien). Wenn bei einem Bogen oder einer Linie die Bildschirmkoordinaten für den Start- und Endpunkt identisch sind, dann kann man die halt nicht darstellen (allenfalls als Punkt, aber das ist nur selten sinnvoll). Auch hat der Endpunkt des vorigen Elements und der Startpunkt des folgenden Element ja auch genau diese Koordinaten. Insofern verlierst du ja nichts - die Kontur weist dabei keine Lücken auf.

Das Problem geht übrigens mit 3D-Grafikroutinen bei OpenGL oder DirectX nicht weg. Es gibt Frameworks die das selbst abfangen, aber am Ende machen die auch genau das: die lassen solche Elemente einfach weg.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
165 Beiträge
 
Delphi 12 Athens
 
#7

AW: Canvas.Arc Problem

  Alt 20. Sep 2024, 12:41
Ich hatte das so probiert, ich denke aber das ist auch nicht richtig gedacht von mir:

Code:

procedure TGCodeRenderer.DrawArc(CX, CY, Radius, StartAngle, EndAngle: Double; Clockwise: Boolean; Color: TColor);
var
  StartX, StartY, EndX, EndY: Double;
  ArcRect: TRect;
begin
  StartX := CX + Radius * Cos(StartAngle);
  StartY := CY + Radius * Sin(StartAngle);
  EndX := CX + Radius * Cos(EndAngle);
  EndY := CY + Radius * Sin(EndAngle);

  (* DIESEN TEIL HATTE ICH MAL GETESTET, IST ABER SICHER AUCH WIEDER FALSCH *)

  if (Round(StartX * FScale) = Round(EndX * FScale)) or (Round(StartY * FScale) = Round(EndY * FScale)) then begin
    FCurrentX := EndX;
    FCurrentY := EndY;
    Exit;
  end;
  *)

  (**************************************************************************)

  ArcRect := Rect(
    Round((CX - Radius) * FScale),
    Round((CY - Radius) * FScale),
    Round((CX + Radius) * FScale),
    Round((CY + Radius) * FScale)
    );

  FCanvas.Pen.Color := Color;

  if Clockwise then begin
    FCanvas.Arc(ArcRect.Left, Round(AdjustY(ArcRect.Top)), Round(ArcRect.Right), Round(AdjustY(ArcRect.Bottom)), Round(EndX * FScale), Round(AdjustY(EndY * FScale)), Round(StartX * FScale), Round(AdjustY(StartY * FScale)));
  end else begin
    FCanvas.Arc(ArcRect.Left, Round(AdjustY(ArcRect.Top)), Round(ArcRect.Right), Round(AdjustY(ArcRect.Bottom)), Round(StartX * FScale), Round(AdjustY(StartY * FScale)), Round(EndX * FScale), Round(AdjustY(EndY * FScale)));
  end;

  FCurrentX := EndX;
  FCurrentY := EndY;
end;
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 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