![]() |
Stern zeichnen
Moin alle miteinander,
ich bin grade dabei eine Aufgabe zu bearbeiten, aber leider stehe ich jetzt aufm Schlauch und komme nicht weiter...deshalb hoffe ich, dass ihr mir einige Tipps geben könnt. Zur Aufgabe selbst: Es soll auf Knopfdruck ein Stern-Vieleck gezeichnet werden, wobei die Anzahl der Zacken aus einem spinedit gelesen wird. Die Zackenspitzen liegen auf einem Außenradius von 150 Pixeln und die Zackenbasis jeweils auf einem Innenradius von 70 Pixeln. So ein Stern besteht ja z.B. aus 5 Zacken, d.h. es sind insgesamt 10 Punkte vorhanden. Je 5 auf dem Außenradius(150) und je 5 auf dem Innenradius(70), aber zueinander versetzt. Gezeichnet soll mit moveto(x,y) und lineto(x,y). Im moment bekomme ich z.B. ein Pentagon, Hexagon usw. also ein N-eck gezeichnet. Also noch keinen wirklichen Stern, weil ich nicht weiß wie ich abwechselnd den kleinen und großen Radius verwenden soll. Kann da wer helfen? Gruß |
AW: Stern zeichnen
Zitat:
Davon ausgehend kann man dir gewiss besser helfen, weil so nicht ersichtlich ist, woran es liegen könnte. Mit Papier und Bleistift ist das Problem aber schon (mathematisch) gelöst? |
AW: Stern zeichnen
Mit Bleistift und Papier sind mir eigentlich die mathematischen und geometrischen Beziehungen klar. Es stockt etwas an der Umsetzung in das Programm...beschäftige mich erst seit kurzem mit Delphi.
EDIT: Hab mal den Code rausgenommen. Ich glaub ich habs! Zumindest sieht das schon mal nach einem stern aus :-) |
AW: Stern zeichnen
Du schreibst in Deinen Code ja schon, dass Du 2 N-Ecke malen willst. Wenn ich das richtig sehe, mußt Du die beide Scheifen zu einer machen. Du mußt von der äußeren Spitze zu inneren Spitze danach wieder zur äußeren usw.
[Edit] Na da wurde ich aber gelinkt.. |
AW: Stern zeichnen
Rechne zuerst die Anzahl der Winkelschritte aus, die du brauchst. Bei einem 5 zackigen Stern sind das 10 Stück. Dann errechne, wie groß einer dieser Winkelschritte ist.
Wenn du das hast, geht der 5 zackige Stern ungefähr so:
Code:
Ach, und vielleicht findest du
phi := 0;
fünfmal: LineZuPunkt(phi, außenradius); phi += Winkelschritt; LineZuPunkt(phi, innenradius); phi += Winkelschritt; LinieZuPunkt(0, außenradius) ![]() |
AW: Stern zeichnen
Mit einer aufgeräumten Funktion sieht man mehr!
Folgender Abschnitt entspricht deinen Quellcode, aber ist etwas sauberer und passt sich automatisch der Größe der Image-Komponente an und spart eine Schleife.
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var i, r2, xm, ym, x, y, zacken, anzahlP : Integer; winkelschritt, winkel : double; begin xm:= img1.Width div 2; // Mittelpunkt auf Imagefeld ym:= img1.Height div 2; if (se1.Value >= 3) then begin zacken := se1.Value // Anzahl Zacken wird aus Spinedit gelesen end else begin zacken := 3; end; anzahlP := 2 * Zacken; // Anzahl Punkte ist zweimal Zacken r2 := ym div 2; // Innenradius von 70 Pixeln winkelschritt:= 2 * Pi / anzahlP; // Winkelschritt abhängig von Zacken img1.canvas.pen.color:= clred; img1.canvas.Ellipse(img1.BoundsRect); img1.canvas.moveto (xm + r2, ym); // Bewege dich auf Startpunkt des N-Ecks for i:= 0 to anzahlP do // N-Eck zeichnen mit Radius 70 begin winkel := winkelschritt * i; x:= round( xm + r2 * cos(winkel) ); y:= round( ym + r2 * sin(winkel) ); img1.canvas.pen.color:= clgreen; img1.canvas.lineto(x,y); end; end; |
AW: Stern zeichnen
Jau, Danke an alle die sich die Mühe gemacht haben mir zu helfen.
Mir ist eingefallen, dass ich die abwechselnden Radien mit eine IF-Bedingung abfragen kann...sowas aber auch ^^ Somit konnte ich das Problem 30 min nach meinem zweiten Post selbst lösen. Geistesblitz oder so :-D Wunderbar! So schwer war das nicht ^^ Danke an alle nochmal. |
AW: Stern zeichnen
Beim nächsten mal, lösche bitte deinen Code nicht. Andere interessiert er eventuell auch noch. Und wenn du jetzt funktionierenden Code hast, dann stell ihn hier auch bitte ein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 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