Autor Beitrag
DarkCell
Hält's aus hier
Beiträge: 9

Win Xp
Delphi 5 pro
BeitragVerfasst: 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 user profile iconChristian S.: Topic aus Sonstiges verschoben am Do 24.11.2005 um 18:04
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Fr 18.11.05 19:45 
Also, Spaceguide meint wohl das hier, oder so ähnlich:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9

Win Xp
Delphi 5 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 22.11.05 18:02 
user profile iconDarkCell 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!):
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9

Win Xp
Delphi 5 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 22.11.05 18:15 
Am Anfang deiner Unit steht sowas ähnliches:
ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9

Win Xp
Delphi 5 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 22.11.05 18:55 
Dieser komische Keil war irgendwie ein Fehler. Hier die neue Version:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9

Win Xp
Delphi 5 pro
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Do 24.11.05 13:56 
user profile iconDarkCell 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:
ausblenden 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.