Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.
Seite 1 von 2  1 2      

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