Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Probleme mit AngleArc (https://www.delphipraxis.net/82817-probleme-mit-anglearc.html)

Alex_ITA01 20. Dez 2006 08:18


Probleme mit AngleArc
 
Hallo erstmal,
ich habe folgendes Problem:

Ich möchte zwei "viertel Kreise" auf einem Canvas zeichnen.
Der erste soll sich auf der linken Seite des Canvas-Image befinden und der andere auf der rechten Seite.
Der erste soll von links 90° abwärts nach rechts gebogen werden und der zweite soll von links 90° aufwärts nach rechts gebogen werden.
Ich habe mir die Funktion AngleArc genommen aber irgendwie komme ich nicht klar.
Den zweiten viertel Kreis habe ich schon so hinbekommen:

Delphi-Quellcode:
  Image1.Canvas.Moveto((Image1.Width Div 2), Image1.Height Div 2);
  AngleArc(Image1.Canvas.Handle,
           Image1.Width div 2,
           Image1.Height div 2,
           60,
           90,
           90);
Vielleicht könnt ihr mir weiter helfen, den ersten auch darzustellen.
Mein Problem sind die Startpunkte des Stiftes.
Wenn man sich das anguckt, ist der Startpunkt nicht immer der Beginn des Winkels sondern in der Mitte.
Ich hoffe ihr versteht mein Problem und könnt mir helfen.
MFG Alex


EDIT:
Ich habe jetzt beide viertel Kreise hinbekommen aber meine Startpositionen stimmen nicht

Delphi-Quellcode:
  Image1.Canvas.Moveto((Image1.Width Div 2), Image1.Height Div 2);
  AngleArc(Image1.Canvas.Handle,
           Image1.Width div 2,
           Image1.Height div 2,
           60,
           90,
           90);

  Image1.Canvas.Moveto((Image1.Width Div 6), Image1.Height Div 2);
  AngleArc(Image1.Canvas.Handle,
           Image1.Width div 6,
           Image1.Height div 2,
           60,
           360,
           90);

marabu 20. Dez 2006 10:14

Re: Probleme mit AngleArc
 
Hallo Alex,

warum mischst du Canvas-Methoden und direkte API-Aufrufe? TCanvas hat eine Methode Arc(), aber egal. MoveTo() ist an dieser Stelle wertlos, da AngleArc() die momentane Cursor-Position von TCanvas nicht kennt. Soll die Mitte vom Image der Punkt pt sein, in dem sich die beiden Virtelkreise berühren, dann sollte AngleArc(Handle, pt.X, pt.Y - Radius, 0, 90) den unteren und AngleArc(Handle, pt.X, pt.Y + Radius, 270, 0) den oberen Viertelkreis zeichnen.

Freundliche Grüße

Alex_ITA01 20. Dez 2006 11:53

Re: Probleme mit AngleArc
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang mal ein Screenshot, was ich darstellen möchte.
Stellt euch einfach vor, es wäre alles abgerundet und nicht so eckig (habe ich nur ganz schnell entworfen).
Ich hoffe ihr könnt mir da helfen.
MFG Alex

Klaus01 20. Dez 2006 12:43

Re: Probleme mit AngleArc
 
Vielleicht hilft Dir die KreisFunktion in diesen Beitrag ja etwas weiter.

Grüße
Klaus

marabu 20. Dez 2006 12:49

Re: Probleme mit AngleArc
 
Sorry Alex,

das MoveTo muss tatsächlich sein:

Delphi-Quellcode:
procedure TDemoForm.FormClick(Sender: TObject);
const
  iRadius = 60;
var
  ptCenter: TPoint;
begin
  ptCenter.X := ClientWidth div 2;
  ptCenter.Y := ClientHeight div 2;
  with Canvas do
  begin
    Pen.Width := 3;
    MoveTo(ptCenter.X - iRadius, ptCenter.Y);
    AngleArc(Handle, ptCenter.X, ptCenter.Y, iRadius, 180, 180);
    MoveTo(ptCenter.X - iRadius, ptCenter.Y);
    AngleArc(Handle, ptCenter.X - 2 * iRadius, ptCenter.Y, iRadius, 0, 90);
    MoveTo(ptCenter.X + 2 * iRadius, ptCenter.Y - iRadius);
    AngleArc(Handle, ptCenter.X + 2 * iRadius, ptCenter.Y, iRadius, 90, 90);
  end;
end;
Freundliche Grüße

Alex_ITA01 20. Dez 2006 13:06

Re: Probleme mit AngleArc
 
Danke marabu,
der Source funktioniert super.
Ich würde nur gerne die "Geraden" (die in/von Richtung des Knickes unten) selber zeichnen oder eben einen Wert vorgeben. Denn das Problem ist, es soll wie eine Art Grube sein und die wird unterschiedlich tief (je nachdem, welchen Wert ich ihr gebe).
Ich hoffe du kannst mir da weiter helfen...
Viele Grüße,
Alex

marabu 20. Dez 2006 14:11

Re: Probleme mit AngleArc
 
Hi,

es sind nur ganz kleine Änderungen notwendig. Ich habe die Variable iDist eingeführt, welche festlegt, wie weit die Viertelkreise vertikal auseinander geschoben werden sollen:

Delphi-Quellcode:
procedure TDemoForm.FormClick(Sender: TObject);
const
  iRadius = 60;
var
  ptCenter: TPoint;
  iDist: Integer;
begin
  ptCenter.X := ClientWidth div 2;
  ptCenter.Y := ClientHeight div 2;
  iDist := 50;
  with Canvas do
  begin
    Pen.Width := 3;
    MoveTo(ptCenter.X - iRadius, ptCenter.Y + iDist div 2);
    AngleArc(Handle, ptCenter.X, ptCenter.Y + iDist div 2, iRadius, 180, 180);
    MoveTo(ptCenter.X - iRadius, ptCenter.Y - iDist div 2);
    // alternativ - um die Lücke zu schließen:
    // MoveTo(ptCenter.X - iRadius, ptCenter.Y + iDist div 2);
    AngleArc(Handle, ptCenter.X - 2 * iRadius, ptCenter.Y - iDist div 2, iRadius, 0, 90);
    MoveTo(ptCenter.X + 2 * iRadius, ptCenter.Y - iRadius - iDist div 2);
    AngleArc(Handle, ptCenter.X + 2 * iRadius, ptCenter.Y - iDist div 2, iRadius, 90, 90);
    // um die Lücke zu schließen:
    // LineTo(ptCenter.X + iRadius, ptCenter.Y + iDist div 2)
  end;
end;
Wenn du den unteren bzw. oberen Rand deiner "Grube" auf konstantem Niveau halten möchtest, dann zeigt dir ein Vergleich der beiden Quellcodes an welcher Stelle du anpassen musst.

Viel Spaß

Alex_ITA01 20. Dez 2006 14:24

Re: Probleme mit AngleArc
 
Danke, dass hilft mir super weiter.
MFG Alex

Alex_ITA01 20. Dez 2006 14:54

Re: Probleme mit AngleArc
 
Hallo marabu,
eine Frage habe ich dann wohl doch noch :-)
Wie bekomme ich es hin, wenn dieser Distanzwert gegen 0 geht, dass dann auch keine Grube gezeichnet wird sondern eben fast eine Gerade?
Ich hoffe, du kannst mir auch hierbei helfen.
MFG Alex

marabu 20. Dez 2006 15:41

Re: Probleme mit AngleArc
 
Hallo Alex,

bei meinem Beispiel haben die Viertelkreise den gleichen Krümmungsradius, das schafft schöne Übergänge. Wenn du eine Grube in Abhängigkeit von zwei Parametern (Öffnungsdurchmesser und Grubentiefe) zeichnen möchtest, wobei die Übergänge auch stetig sein sollen, dann ist eventuell die Methode Arc() von TCanvas einfacher in der Verwendung, da du dabei mit den Hüllen-Rechtecken arbeiten kannst. Fertigen Code habe ich jetzt keinen für dich, aber schwierig ist es nicht. Du arbeitest dann mit Ellipsen, nicht mit Kreisen. Probiere es mal.

Freundliche Grüße

Robert Marquardt 20. Dez 2006 16:58

Re: Probleme mit AngleArc
 
Zitat:

Zitat von marabu
warum mischst du Canvas-Methoden und direkte API-Aufrufe? TCanvas hat eine Methode Arc(), aber egal.

AngleArc und Arc sind verschiedene Funktionen. Die Methode Arc bildet nur auf Windows.Arc ab. AngleArc ist keine TCanvas-Methode, da es AngleArc erst ab Win NT gibt.
Ich habe mal AngleArc fuer eine Komponente gebraucht, die einen Dreiviertelkreisstreifen eines Messgeraetes in Falschfarben anzeigt. Da muss man allerdings noch einige Pixel interpolieren, da konzentrische Kreise/Kreisboegen nicht alle Pixel abdecken.

marabu 20. Dez 2006 17:17

Re: Probleme mit AngleArc
 
Hallo Robert,

danke für die Info - auch wenn ich die Zeit zwischen Beitrag #2 und #5 dazu genutzt habe mich selbst zu informieren. Aber auch der direkte Aufruf von Windows.Arc() hätte mich irritiert, wenn doch gerade mit TCanvas gearbeitet wird. Aber wie du schreibst: Durch die Abbildung auf die GDI-Funktionen gibt es ja keine Inkonsistenzen. Fehlende Pixel sind mir bei der Verwendung von AngleArc() gar nicht aufgefallen. Vielleicht weil ich die Zeichenbreite des Stiftes auf 3 gesetzt hatte. Oder ich brauche nun doch bald eine Sehhilfe.

Freundliche Grüße

Robert Marquardt 20. Dez 2006 17:40

Re: Probleme mit AngleArc
 
Genau die Stiftbreite ist es. Malt man konzentrische Kreise/Kreissegmente mit AngleArc mit Stiftbreite 1, dann gibt es eben Fehlstellen. Das sind Rundungsartefakte, da ja auf Pixel abgebildet wird.
Einen breiteren Stift konnte ich in meiner Komponente nicht nehmen, da dies ja die andersfarbigen benachbarten Kreissegmente uebermalen wuerde. Ich habe dann die Fehlstellen einfach interpoliert.

Ja, Kreise malen ist nicht einfach.

DP-Maintenance 21. Dez 2006 05:42

DP-Maintenance
 
Dieses Thema wurde von "r_kerber" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Das Thema hat eindeutig mit Delphi zu tun und gehört demzufolge nicht nach Programmieren allgemein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 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