| Autor |
Beitrag |
DarkCell
Hält's aus hier
Beiträge: 9
Win Xp
Delphi 5 pro
|
Verfasst: Fr 18.11.05 18:22
Wir sollen als Hausaufgabe mit ner TImage-Komponente eine Spirale aus vielen einzelnen Linien zeichnen mit einer while-Schleife.
Die Spirale soll in der Bildmitte anfangen und irgendwann am Bildrand aufhören.
Wie man zeichnet und so weiß ich schon, aber mir fällt kein Zusammenhang ein, mit dem ich unter mehrmaliger Widerholung eine Spirale zeichnen könnte.
Wär schon sehr dankbar für nen Ansatz.
Danke schonmal im voraus. Moderiert von Christian S.: Topic aus Sonstiges verschoben am Do 24.11.2005 um 18:04
|
|
Spaceguide
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Fr 18.11.05 18:33
Einfach einen Kreis mit stetig steigendem Radius zeichnen:
x = cos(i*Pi) * i * factor + mitte_x
y = sin(i*Pi) * i * factor + mitte_y
je kleiner factor, desto enger liegen die Spirallinien an.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Fr 18.11.05 19:45
Also, Spaceguide meint wohl das hier, oder so ähnlich:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| const Breite = 5; var r, g, x, y: Integer; begin g := 0; Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; for r := 0 to Image1.Picture.Bitmap.Width div 2 do begin g := Round(g + Breite); if g = 360 then g := 0; x := Round((cos(GradToRad(g)) * r) + (Image1.Picture.Bitmap.Width div 2)); y := Round((sin(GradToRad(g)) * r) + (Image1.Picture.Bitmap.Width div 2)); Image1.Picture.Bitmap.Canvas.Pixels[x, y] := clRed; end; |
!!! Code ist aber ungetestet !!!
Zuletzt bearbeitet von Chryzler am Di 22.11.05 18:08, insgesamt 1-mal bearbeitet
|
|
DarkCell 
Hält's aus hier
Beiträge: 9
Win Xp
Delphi 5 pro
|
Verfasst: Di 22.11.05 17:56
Also der Code funktioniert so nicht. Er zeigt mir Undefinierter Bezeichner sowohl für Bitmap bei Image1.bitmap an als auch für die Funktion GradToRad.
Zweitens verstehe ich noch nicht ganz was da eigentlich passiert.
Trotzdem Danke für die bisheriger Hilfe
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Di 22.11.05 18:02
DarkCell hat folgendes geschrieben: | Also der Code funktioniert so nicht. Er zeigt mir Undefinierter Bezeichner sowohl für Bitmap bei Image1.bitmap an als auch für die Funktion GradToRad.
Zweitens verstehe ich noch nicht ganz was da eigentlich passiert.
Trotzdem Danke für die bisheriger Hilfe |
Das war ja auch 'nur' ein falscher "Codeschnipsel":
Hier der richtige (I hope!):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| const Breite = 5; var r, g, x, y: Integer; begin g := 0; Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; for r := 0 to Image1.Picture.Bitmap.Width div 2 do begin g := Round(g + Breite); if g = 360 then g := 0; x := Round((cos(GradToRad(g)) * r) + (Image1.Picture.Bitmap.Width div 2)); y := Round((sin(GradToRad(g)) * r) + (Image1.Picture.Bitmap.Width div 2)); Image1.Picture.Bitmap.Canvas.Pixels[x, y] := clRed; end; |
Es muss außerdem noch die Unit math eingebunden werden
|
|
DarkCell 
Hält's aus hier
Beiträge: 9
Win Xp
Delphi 5 pro
|
Verfasst: Di 22.11.05 18:11
Und wie binde ich die Unit Math ein?
(Bin leider noch ein ziemlich blutiger Anfänger zudem ham wir einen Schleichlehrer.SRY)
Nett wäre auch noch mal eine Erklärung was eigentlich jetzt dort genau passiert.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Di 22.11.05 18:15
Am Anfang deiner Unit steht sowas ähnliches:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type |
Du machst das Semikolon nach dem ExtCtrls weg und däfür schreibst du ", math;" hin. Im Uses-Abschnitt stehen alle Units, die der Compiler vorher liest.
Also dann so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, math;
type |
Wegen der Erklärung:
Beschäftige dich mal ein bisschen mit den trigonomischen Funktionen (sin, cos, tan...).
|
|
DarkCell 
Hält's aus hier
Beiträge: 9
Win Xp
Delphi 5 pro
|
Verfasst: Di 22.11.05 18:33
Erstmal großen Dank für die sehr schnelle Hilfe.
Ich muss nur erstmal verstehen was da eigentlich passiert, bevor ich das als Hausaufgabe abgebe, von daher wird mich das erstmal sehr beschaftigen(<--das ist bitte nicht negativ zu verstehen, ich hatte mir bloß die ganze Hausaufgabe etwas einfacher vorgestellt, da wir uns eigentlich noch auf einem unglaublich niedrigen niveau bewegen in dem Informatik-Unterricht[wir ham nich mal bisher mit Variablen gearbeitet, ich bin bloß ein bisschen schneller, als die anderen un ein bisschen weiter])
Eine klitzekleine Frage noch*nerv* :
Warum ist bei der Spirale eine Art Keil drin auf dem sich keine Punkte befinden?
Danke für die überaus flotte Hilfe und Respekt vor eurem Fachwissen.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Di 22.11.05 18:55
Dieser komische Keil war irgendwie ein Fehler. Hier die neue Version:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| const Breite = 0.01; var x, y: Integer; g, r: Single; begin g := 0; r := 0; Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; repeat g := g + 0.05; r := r + Breite; x := Round((cos(GradToRad(g)) * r) + (Image1.Picture.Bitmap.Width div 2)); y := Round((sin(GradToRad(g)) * r) + (Image1.Picture.Bitmap.Width div 2)); Image1.Picture.Bitmap.Canvas.Pixels[x, y] := clRed; until r >= Image1.Picture.Bitmap.Width div 2; end; |
|
|
DarkCell 
Hält's aus hier
Beiträge: 9
Win Xp
Delphi 5 pro
|
Verfasst: Do 24.11.05 13:11
Ich glaube ich habe es soweit verstanden.
Nur "noch" zwei Sachen:
Die Werte die zu g und r jedesmal dazu addiert werden (0,05 und 0,01), sind die durch probieren herausgefunden oder steht da auch eine Rechnung hinter?
Zweitens wozu:
Delphi-Quelltext 1: 2:
| Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; |
Ich habe schon gemerkt,dass es nur mit Image1.width nicht geht.Trotzden kenne ich diese Zuweisung noch nicht und die Delphi-Hilfe war mir auch nicht behilflich, warum du dies benutzt.
Warum weist du auch Height zu, wenn du es doch in der weiteren Prozedur nicht benutzt?
Nochmals Danke im Voraus.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Do 24.11.05 13:56
DarkCell hat folgendes geschrieben: | Ich glaube ich habe es soweit verstanden.
Nur "noch" zwei Sachen:
Die Werte die zu g und r jedesmal dazu addiert werden (0,05 und 0,01), sind die durch probieren herausgefunden oder steht da auch eine Rechnung hinter?
Zweitens wozu:
Delphi-Quelltext 1: 2:
| Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; |
Ich habe schon gemerkt,dass es nur mit Image1.width nicht geht.Trotzden kenne ich diese Zuweisung noch nicht und die Delphi-Hilfe war mir auch nicht behilflich, warum du dies benutzt.
Warum weist du auch Height zu, wenn du es doch in der weiteren Prozedur nicht benutzt?
Nochmals Danke im Voraus. |
Ja, also bei den Werte für g und r hab ich durch probieren herausgefunden, wie die Spirale schön aussieht. Du kannst aber ruhig ein bisschen mit anderen Werten rumprobieren.
Image1.Width ist die Größe von dem Image1.
Image1.Picture.Bitmap.Width ist die GRöße vom Bild, das im Image1 zu sehen ist.
Wenn ich Image1.Picture.Bitmap.Width und Image1.Picture.Bitmap.Height nichts zuweisen würde, ist die Größe des Bildes null.
|
|