![]() |
einen Kreis zu Fuß zeichen
Hallo,
ich möchte gerne einen Kreis zu Fuß zeichnen. Ich weiß aber nicht wie das geht. Ich glaube irgendwie mit sin und cos oder so. kann mir jemend einen Tip geben??? Achso der Kreis soll mir Canvas gezeichnet werden und es soll nicht mit ellipse gemacht werden. Mit freundlichen Grüßen Christian18 |
Re: einen Kreis zu Fuß zeichen
Hi Christian,
du musst in einer Schleife den Winkel durchgehn und darin die Koordinaten ausrechnen:
Delphi-Quellcode:
Ich weiß jetzt auf die Schnelle aber nicht wie die Funktion heißt, um ein Pixel setzen zu können :oops:
function DegToRad(Deg: Real): Real;
begin return Deg*Pi/180; end; function ZeichneKreis(r: Real); var i: Integer; x, y: Real; begin for i := 0 to 359 do begin x := r*cos(DegToRad(i)); y := r*sin(DegToRad(i)); //Pixel setzen end; end; Greetz alcaeus |
Re: einen Kreis zu Fuß zeichen
Zitat:
Delphi-Quellcode:
;)
Canvas.Pixels[x, y] := clBlack;
|
Re: einen Kreis zu Fuß zeichen
Hi Matthias,
um genau zu sein wäre es
Delphi-Quellcode:
da x und y als Real deklariert sind. :zwinker:
Canvas.Pixels[Trunc(x), Trunc(y)] := clBlack;
Greetz alcaeus |
Re: einen Kreis zu Fuß zeichen
vielleicht solltest du aber keine punkte zeichnen, sonder die punkte mit linien verbinden. Wenn der Kreis sonst zu groß wird kanns dir passieren, dass der kreis nicht richtig verbunden is!
|
Re: einen Kreis zu Fuß zeichen
Hi Christian,
Chimaira hat Recht, das hab ich in meinem Code nicht berücksichtigt. Hier eine Version die funktionieren (müsste)
Delphi-Quellcode:
Greetz
function DegToRad(Deg: Real): Real;
begin return Deg*Pi/180; end; function ZeichneKreis(mx, my: Integer; r: Real); var i: Integer; x, y: Real; begin MoveTo(mx+r, my); for i := 1 to 359 do begin x := r*cos(DegToRad(i)); y := r*sin(DegToRad(i)); LineTo(mx+x,my-y); end; LineTo(mx+r, my); end; alcaeus |
Re: einen Kreis zu Fuß zeichen
@Alc: Fehlt da nicht das MoveTo in der Schleife, so kommt's mir etwas spanisch vor. ;)
Edit: Und vor das MoveTo / LineTo gehört evtl irgend ein Canvas. :roll: |
Re: einen Kreis zu Fuß zeichen
LineTo macht das selbe wie MoveTo, nur dass die Linie noch dazugezeichnet wird. Passt schon so!
[Edit]: Das könnt man einfach mit einem
Delphi-Quellcode:
am anfang und einem end am ende der proc lösen
with canvas do begin
@Alcaeus: :coder: better :mrgreen: :zwinker: :cheers: @supermuckl: wär das beste, aber das komplizierteste... [/Edit] |
Re: einen Kreis zu Fuß zeichen
warum willst du denn ein MoveTo in der Schleife? Als erstes gehst du an den Startpunkt und dann zeichnest du ohne Abzusetzen die Kreislinie.
|
Re: einen Kreis zu Fuß zeichen
ähm leute
anstatt da linien von winkel zu winkel zu zeichnen ( wird bei großen kreisen nich grad schön aussehen ) könntet ihr auch die halben winkel ( kommastellen oder auch winkelminuten genannt ) berechnen und somit einen echten kreis zeichnen via pixel setzen ihr müsstet halt noch bisschen ausbaldovern wie ihr rausrechnen könnt wieviele kommastellen ihr minimal braucht um die auflösung für einen bestimmten radius raus zu rechnen. |
Re: einen Kreis zu Fuß zeichen
Wie?
Kann man sagen LineTo = LineTo + MoveTo? :gruebel: Falls ja, dann stimmt Alcs Lösung natürlich, falls nein, dann verstehe ich sie nicht. MoveTo (Hinspringen) LineTo (von MoveTo aus zeichnen) oder nicht? :gruebel: |
Re: einen Kreis zu Fuß zeichen
wenn du ohne moveto arbeitest ( am anfang einmal )
dann ziehst du ne linie von 0,0 bis zu deinem ersten lineto wenn du das unschöne ding da weghaben willst dann solltest du erstmal mit moveto an deinen anfang im kreis springen und dann weiter machen mit lauter lineto's ansonsten braucht man kein moveto .. ausser man will halt ohne eine zwischenlinie ziehen irgendwo anderst ne neue linie ziehen |
Re: einen Kreis zu Fuß zeichen
Moveto -> setztden Stift an die übergebene Position
Lineto -> zeichnet eine Linie von der aktuellen Position zur übegebenen Position und setzt den Stift dorthin [steht aber auch alles so in der OH ] |
Re: einen Kreis zu Fuß zeichen
Hi Jungs,
Zitat:
Und zum Canvas & co.: "It's not a feature, it's a bug". So ist es kein Copy&Waste-Code :mrgreen: Das Problem muss aber nicht notwendigerweise mit Trigonometrie gelöst werden:
Delphi-Quellcode:
Damit erhälst du die Punkte, welche du dann nur verbinden musst. Der Weg mit y1 und y2 ist nötig, da man eine quadratische Funktion umgeformt hat und damit eine Lösung fallen lassen würde. (ich geh hier nicht weiter ins Detail :roll:)
for i := mx-r to mx+r do
begin y1 := sqrt(sqr(x)-sqr(r)); y2 := -sqrt(sqr(x)-sqr(r)); end; Greetz alcaeus |
Re: einen Kreis zu Fuß zeichen
@Toxman: Ich kenne die Funktion, OH? Das sagst du mir?
Das habe ich doch vorher gesagt, musst nur lesen. ;) |
Re: einen Kreis zu Fuß zeichen
Wo hast du was von der OH gesagt? Es kam mir auch komisch vor, aber
Zitat:
|
Re: einen Kreis zu Fuß zeichen
Naja, ich meinte nur:
MoveTo (Hinspringen) LineTo (von MoveTo aus zeichnen) oder nicht? Und deshalb wundere ich mich, wieso nur einmal MoveTo bei Alc steht und zig Mal LineTo. :wink: |
Re: einen Kreis zu Fuß zeichen
Weil LineTo auch die aktuelle Position an das Ende der Linie setzt ;).
Ist im Grunde ein MoveTo, nur dass ne Linie mitgezogen wird. |
Re: einen Kreis zu Fuß zeichen
Ich wuerde mich mal mit dem Bresenham-Algorithmus beschaeftigen.
Der kann nicht nur Linien zeichnen sondern auch Ellipsen/Kreise. Alles ohne Floating Point Operationen. Der Algorithmus liefert sogar Antialiasing-Informationen. |
Re: einen Kreis zu Fuß zeichen
Hallo,
bei mir geht der Quelltext vorn und hinten nicht :(.
Delphi-Quellcode:
Da meckert er schon mit return. ([Fehler] Unit1.pas(27): Undefinierter Bezeichner: 'return')
return Deg*Pi/180;
Delphi-Quellcode:
hier erzählt er mir: "[Fehler] Unit1.pas(27): Funktion benötigt Ergebnistyp".
function ZeichneKreis(mx, my: Integer; r: Real);
Des weiteren: [Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'MoveTo' [Fehler] Unit1.pas(35): Undefinierter Bezeichner: 'DegToRad' [Fehler] Unit1.pas(37): Inkompatible Typen: 'HDC' und 'Extended' [Fehler] Unit1.pas(39): Inkompatible Typen: 'HDC' und 'Extended' Kamm mir bitte jemand helfen? Whoopee |
Re: einen Kreis zu Fuß zeichen
Hi MrWhoopee,
anscheinend programmiere ich zuviel php :roll: Hier der überarbeitete Code
Delphi-Quellcode:
Zu deinen Fehlern, hast du die Unit Graphics eingebunden? Das ist der einzige Fehler der mir einfällt.
function DegToRad(Deg: Real): Real;
begin Result := Deg*Pi/180; end; procedure ZeichneKreis(mx, my: Integer; r: Real; aCanvas: TCanvas); var i: Integer; x, y: Real; begin aCanvas.MoveTo(Round(mx+r), Round(my)); for i := 1 to 359 do begin x := r*cos(DegToRad(i)); y := r*sin(DegToRad(i)); aCanvas.LineTo(Round(mx+x),Round(my-y)); end; aCanvas.LineTo(Round(mx+r), Round(my)); end; Greetz alcaeus [edit]Fehler im Code, siehe nächsten Beitrag[/edit] |
Re: einen Kreis zu Fuß zeichen
Zitat:
Delphi-Quellcode:
procedure ZeichneKreis(mx, my: Integer; r: Real; aCanvas: TCanvas);
|
Re: einen Kreis zu Fuß zeichen
:roll: Ich sollte wirklich wieder Delphi programmieren.
Fehler ist korrigiert. Greetz alcaeus |
Re: einen Kreis zu Fuß zeichen
Das ist ein Fehler der erst in Delphi 5 beseitigt wurde.
Vorher konnte man procedure deklarieren und function implementieren. |
Re: einen Kreis zu Fuß zeichen
Zitat:
|
Re: einen Kreis zu Fuß zeichen
dann erstmal mega danke :)
wenn du das so so hinbekommen würdest, dass man die kugel in 3d berechnet, dann in 2d runterrechnet und mit canvas darstellt, dann biste der gott :D EDIT: wie kann ich die canvasfarbe da ändern? |
Re: einen Kreis zu Fuß zeichen
fürs farbe ändern: Canvas.Pen.Color is da das stichwort
|
Re: einen Kreis zu Fuß zeichen
Und wenn es sich nicht nur im Punkte/Linien handelt, dann ist zusätzlich auch noch Canvas.Brush.Color wichtig ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 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