![]() |
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:
Vielleicht könnt ihr mir weiter helfen, den ersten auch darzustellen.
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); 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); |
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 |
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 |
Re: Probleme mit AngleArc
|
Re: Probleme mit AngleArc
Sorry Alex,
das MoveTo muss tatsächlich sein:
Delphi-Quellcode:
Freundliche Grüße
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; |
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 |
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:
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.
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; Viel Spaß |
Re: Probleme mit AngleArc
Danke, dass hilft mir super weiter.
MFG Alex |
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 |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz