Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi einen Kreis zu Fuß zeichen (https://www.delphipraxis.net/29720-einen-kreis-zu-fuss-zeichen.html)

Christian18 13. Sep 2004 20:36


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

alcaeus 13. Sep 2004 20:41

Re: einen Kreis zu Fuß zeichen
 
Hi Christian,

du musst in einer Schleife den Winkel durchgehn und darin die Koordinaten ausrechnen:

Delphi-Quellcode:
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;
Ich weiß jetzt auf die Schnelle aber nicht wie die Funktion heißt, um ein Pixel setzen zu können :oops:

Greetz
alcaeus

Matze 13. Sep 2004 20:42

Re: einen Kreis zu Fuß zeichen
 
Zitat:

Zitat von alcaeus
Ich weiß jetzt auf die Schnelle aber nicht wie die Funktion heißt, um ein Pixel setzen zu können :oops:

Evtl meinst du

Delphi-Quellcode:
Canvas.Pixels[x, y] := clBlack;
;)

alcaeus 13. Sep 2004 20:45

Re: einen Kreis zu Fuß zeichen
 
Hi Matthias,

um genau zu sein wäre es
Delphi-Quellcode:
Canvas.Pixels[Trunc(x), Trunc(y)] := clBlack;
da x und y als Real deklariert sind. :zwinker:

Greetz
alcaeus

JasonDX 13. Sep 2004 20:46

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!

alcaeus 13. Sep 2004 20:49

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:
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;
Greetz
alcaeus

Matze 13. Sep 2004 20:56

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:

JasonDX 13. Sep 2004 20:59

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:
with canvas do begin
am anfang und einem end am ende der proc lösen


@Alcaeus: :coder: better :mrgreen: :zwinker: :cheers:
@supermuckl: wär das beste, aber das komplizierteste...
[/Edit]

Nikolas 13. Sep 2004 21:01

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.

supermuckl 13. Sep 2004 21:02

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.

Matze 13. Sep 2004 21:05

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:

supermuckl 13. Sep 2004 21:08

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

Nikolas 13. Sep 2004 21:08

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 ]

alcaeus 13. Sep 2004 21:18

Re: einen Kreis zu Fuß zeichen
 
Hi Jungs,

Zitat:

Zitat von Chimaira
@Alcaeus: :coder: better :mrgreen: :zwinker: :cheers:

Ist noch zu früh :roll: :mrgreen:

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:
for i := mx-r to mx+r do
begin
  y1 := sqrt(sqr(x)-sqr(r));
  y2 := -sqrt(sqr(x)-sqr(r));
end;
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:)

Greetz
alcaeus

Matze 13. Sep 2004 21:19

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. ;)

Nikolas 13. Sep 2004 21:24

Re: einen Kreis zu Fuß zeichen
 
Wo hast du was von der OH gesagt? Es kam mir auch komisch vor, aber
Zitat:

LineTo = LineTo + MoveTo?

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?
klang etwas seltsam :gruebel: :gruebel:

Matze 13. Sep 2004 21:31

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:

dizzy 13. Sep 2004 21:51

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.

Robert Marquardt 14. Sep 2004 05:50

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.

Mr Whoopee 5. Okt 2004 09:57

Re: einen Kreis zu Fuß zeichen
 
Hallo,

bei mir geht der Quelltext vorn und hinten nicht :(.
Delphi-Quellcode:
return Deg*Pi/180;
Da meckert er schon mit return. ([Fehler] Unit1.pas(27): Undefinierter Bezeichner: 'return')

Delphi-Quellcode:
function ZeichneKreis(mx, my: Integer; r: Real);
hier erzählt er mir: "[Fehler] Unit1.pas(27): Funktion benötigt Ergebnistyp".
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

alcaeus 5. Okt 2004 10:04

Re: einen Kreis zu Fuß zeichen
 
Hi MrWhoopee,

anscheinend programmiere ich zuviel php :roll:
Hier der überarbeitete Code
Delphi-Quellcode:
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;
Zu deinen Fehlern, hast du die Unit Graphics eingebunden? Das ist der einzige Fehler der mir einfällt.

Greetz
alcaeus

[edit]Fehler im Code, siehe nächsten Beitrag[/edit]

fiasko 5. Okt 2004 10:19

Re: einen Kreis zu Fuß zeichen
 
Zitat:

Zitat von alcaeus
Delphi-Quellcode:
function ZeichneKreis(mx, my: Integer; r: Real; aCanvas: TCanvas);

alcaeus meinte sicherlich :mrgreen: :

Delphi-Quellcode:
procedure ZeichneKreis(mx, my: Integer; r: Real; aCanvas: TCanvas);

alcaeus 5. Okt 2004 10:22

Re: einen Kreis zu Fuß zeichen
 
:roll: Ich sollte wirklich wieder Delphi programmieren.
Fehler ist korrigiert.

Greetz
alcaeus

Robert Marquardt 5. Okt 2004 16:35

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.

FAlter 5. Okt 2004 16:50

Re: einen Kreis zu Fuß zeichen
 
Zitat:

Zitat von Robert Marquardt
Das ist ein Fehler der erst in Delphi 5 beseitigt wurde.
Vorher konnte man procedure deklarieren und function implementieren.

Dann finde ich es verwunderlich, dass Delphi 3 dabei herummeckert, wenn das erst ab 5 nicht mehr geht...

Mr Whoopee 7. Okt 2004 16:25

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?

JasonDX 7. Okt 2004 16:40

Re: einen Kreis zu Fuß zeichen
 
fürs farbe ändern: Canvas.Pen.Color is da das stichwort

himitsu 7. Okt 2004 17:09

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 10:25 Uhr.

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