Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Kreisbogen zeichnen
Green - Mo 05.06.06 22:07
Titel: Kreisbogen zeichnen
hat jemand eine Idee wie ich in einer Canvas einen Kreisbogen zeichnen kann? also mit beliebiger Grad Zahl?
das heisst zum beispiel einen bogen wie den folgenden:
das graue soll nicht gezeichnet werden (nur zur verdeutilichung...) aber wie macht man sowas? also mit X,Y,radius und Winkel
mfG Green
Arno Nym - Mo 05.06.06 22:14
Hi!
die Antwort ist Arc()...einfach nur Arc().... :)
MFG, Arno Nym
Green - Mo 05.06.06 22:25
danke, aber was muss ich machen um diese version von Arc zu verwenden?
Delphi-Quelltext
1:
| procedure Arc(X, Y, W, H, Angle, AngleLength: Integer); overload; |
alias5000 - Mo 05.06.06 22:40
Ich würde in diesem Fall direkt an ide Delphi Hilfe verweisen
Gruß alias5000
Arno Nym - Mo 05.06.06 22:44
Hi!
hm, diese Version steht zwar in der Hilfe, ist aber gar nich implementiert, jedenfalls hab ichs nicht gefunden...
Sieht so aus als wenn du sie selber schreiben musst :)
Naja, Ich versuch mal schnell die Funktion zu implementieren...
MFG, Arno Nym
Green - Mo 05.06.06 22:48
| Zitat: |
Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle.
procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); overload;
procedure Arc(X, Y, W, H, Angle, AngleLength: Integer); overload;
Description
Use Arc to draw an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4).
Use the second syntax to draw an arc defined by the rectangle (X,Y,W,H), the start angle Angle and the arc length AngleLength.
The angles Angle and AngleLength are 1/16th of a degree. For example, a full circle equals 5760 (16*360). Positive values of Angle and AngleLength mean counter-clockwise while negative values mean clockwise direction. Zero degrees is at the 3'o clock position.
Note: If you are developing a cross platform application and also targeting Windows 95, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. |
steht so in der Delphi Ide Help
Christian S. - Mo 05.06.06 22:52
In Delphi 2005 ist die zweite Version auch in der Hilfe nicht mehr enthalten. Das wurde anscheinend korrigiert.
Arno Nym - Mo 05.06.06 23:19
Hi!
also, falls du mit Winkeln arbeiten willst, hab ich nochmal eine arc-Funktion für dich geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Procedure drawarc(C:TCanvas;X,Y,R:Integer;startangle,endangle:real); var p1,p2: TPoint; temp,factor,runner : real; begin; IF startangle > endangle then begin; temp := startangle; startangle := endangle; endangle := temp; end; runner := startangle; p1.X := round(cos(runner)*R+X); p1.Y := round(sin(runner)*R+Y); factor := PI/R; While runner < endangle do begin; runner := runner + factor; p2.X := round(cos(runner)*R+X); p2.Y := Y-round(sin(runner)*R); C.MoveTo(p1.X,p1.Y); C.LineTo(p2.X,p2.Y); P1 := P2; end; end; |
Hier z.B. der Aufruf für einen Viertelkreis im ersten Quadranten auf der Fläche eines Formulars:
Delphi-Quelltext
1:
| drawarc(Form1.Canvas,round(Form1.Width/2),round(Form1.Height/2),MIN(round(Form1.Width/2),round(Form1.Height/2)),0,PI/2); |
MFG, Arno Nym
Green - Di 06.06.06 10:13
hmm, also ich versteh die proc nit so ganz, wenn ich dein Beispiel nehm bekomm ich MIN is unnknown identifier, und nach ein bissel ausprobieren hab ich das da für einen ViertelKreis:
Delphi-Quelltext
1:
| DrawArc(Image1.Canvas,100,100,50,0,PI/2); |
die params X,Y und R sind klar, aber StartAngel und Endangel sind mir nich so klar, zum Beispiel fängt der Kreis bei StartAngel 0 ganz Rechts an und bei Startangel 1 hab ich plötzlich eine Gerade im Bild...
Delphi-Quelltext
1:
| DrawArc(Image1.Canvas,100,100,50,1,PI/2); |
kannst du mir helfen?
Arno Nym - Di 06.06.06 11:03
Hi!
Ja, das mit der Gerade habe ich eben behoben, und noch einen anderen Bug. Hier ist die neue Procedure:
MIN ist ein Befehl aus der Unit "math" die muss man natürlich vorher einbinden wenn man MIN benutzen will,
aber das war ja auch nur ein Beispiel.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| Procedure drawarc(C:TCanvas;X,Y,R:Integer;startangle,endangle:real); var p1,p2: TPoint; temp,factor,runner : real; begin; IF startangle > endangle then begin; temp := startangle; startangle := endangle; endangle := temp; end; C.Pixels[X,Y] := clred; runner := startangle; p1.X := round(cos(runner)*(R-1)+X); p1.Y := Y-round(sin(runner)*(R-1)); factor := PI/R; While runner < endangle do begin; runner := runner + factor; p2.X := round(cos(runner)*(R-1)+X); p2.Y := Y-round(sin(runner)*(R-1)); C.MoveTo(p1.X,p1.Y); C.LineTo(p2.X,p2.Y); P1 := P2; end; end; |
MFG, Arno Nym
Green - Do 08.06.06 10:07
k danke, ich denke das müsste klappen, aber was muss ich denn in der proc ändern um IM UHRZEIGERSINN zu drehen? weil so drehts ja von rechts nach links, ich bräuchte es aber von Links nach rechts...
mfG Green
Arno Nym - Do 08.06.06 11:10
Hi!
Auch noch Extrawünsche oder wat ??? :D
Also hier die End-Version der Funktion die auch gegen den Urzeigersinn zeichnen kann (startangle > endangle)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Procedure drawarc(C:TCanvas;X,Y,R:Integer;startangle,endangle:real); var p1,p2: TPoint; factor,runner : real; begin; C.Pixels[X,Y] := clred; runner := startangle; p1.X := round(cos(runner)*(R-1)+X); p1.Y := Y-round(sin(runner)*(R-1)); IF startangle < endangle Then factor := PI/R Else factor := -PI/R; While ((startangle < endangle) AND (runner < endangle)) OR ((startangle > endangle) AND (runner > endangle)) do begin; runner := runner + factor; p2.X := round(cos(runner)*(R-1)+X); p2.Y := Y-round(sin(runner)*(R-1)); C.MoveTo(p1.X,p1.Y); C.LineTo(p2.X,p2.Y); P1 := P2; end; end; |
MFG, Arno Nym
Sors - So 21.01.07 19:41
Titel: Bogen zeichnen
Hab da lange drüber gegrübelt. Versteh das leider auch ned. Gibts ned noch irgendwie ne bessere Lösung??
Allesquarks - So 21.01.07 19:47
Die Koordinaten stellen in deinem Fall die Koordinaten eines virtuellen Koordinatensystems da oder bezüglich der Grafik in die du malst also die Position in der Bitmap?
//Edit: Wie bin ich eigentlich vor den Post von Sors gekommen eigentlcih wollte ich auf ihn antworten?:gruebel:
Sors - So 21.01.07 20:29
Titel: Kreisbogen
Hier nochmal mein Problem:
Es soll in meinem Programm ein Kreisbogen gezeichnet werden, nur anhand der Koordinaten des Mittelpunktes, des Startpunktes und des Endpunktes UNABHÄNGIG vom Winkel. Deswegen hilft mir das oben nicht viel weiter.
Wie schaff ich es also einen Kreisbogen NUR aus den Koordinaten
M(m1|m2) Mittelpunkt
S(x1|y1) Startpunkt
E(x2|y2) Endpunkt
zu zeichnen?
Der Radius des Bogens berechnet sich wie folgt
r = Sqrt(Sqr(m1-x1)+Sqr(m2-y1))
Wer kann mir da weiterhelfen. Im Voraus schon einmal Danke.
F34r0fTh3D4rk - So 21.01.07 20:46
muss denn der zweite punkt auf dem kreis liegen ? sonst lässt du den kreis da enden wo die gerade die durch M und P2 geht geschnitten wird.
mfg
delfiphan - So 21.01.07 21:55
@Sors:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure MyArc(Canvas: TCanvas; m1, m2, x1, y1, x2, y2: Integer); var R: Integer; begin R := Round(Sqrt(Sqr(m1-x1)+Sqr(m2-y1))); Canvas.Arc(m1-R, m2-R, m1+R, m2+R, x1, y1, x2, y2); end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!