Entwickler-Ecke
Multimedia / Grafik - Images, die sich im Kreis bewegen
-Nala- - Fr 02.11.07 21:41
Titel: Images, die sich im Kreis bewegen
Hallo!
Ich bin was das Programmieren mit Delphi angeht ziemlich schlecht und brauche eure Hilfe.
Ich soll für die Schule ein Programm schreiben mit dem sich eine ellipse (in einem viereckigen image) im kreis bewegt. Das soll dann später mal sone art veranschaulichung der Planeten die um die Sonne kreisen werden. Das Thema ist gravitation.
Jedenfalls denke ich mal, dass ich da irgendwie pi mit einbeziehen muss aber ich hab keine Ahnung wo oder wie. Ich hab schon einen Timer eingefügt. Nun kann ich die images vertikal oder horizontal bzw. sogar schief bewegen aber so eine richtige kreisform krieg ich nicht hin.
Schon mal jetzt danke für eure antworten!!!
Moderiert von
Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 02.11.2007 um 20:44
Jann1k - Fr 02.11.07 21:49
versuchs mal mit sin und cos, damit kriegste leicht ne kreisbahn hin. Pi ist dafür ziemlich fehl am Platze
-Nala- - Fr 02.11.07 21:56
oke...
könntest du das vielleicht ein bisschen genauer erklären??? Irgendwie hab ich das noch nicht so wirklich verstanden...
Jann1k - Fr 02.11.07 22:27
Ja, wie groß ist denn dein mathematisches Verständnis?
Ich hab mal ein Bild angehängt.
sin(x) gibt dir das Verhältnis von Hypothenuse zu Gegenkathete, d.h. um die Länge der Gegenkathete zu erhalten rechnest du sin(x)*hypothenuse. Addierst du noch die y-Koordinate des Kreismittelpunktes, hast du schon die y-koordinate des punktes auf der Kreislinie.
Für den X-wert geht das ganze analog nur mit cos(x).
Zu beachten ist das die funktionen sin und cos den x-Wert nicht in Gradmaß(0°-360°) sondern in Radialmaß(0-2Pi) benötigen. Um dir das rechnen mit Radialmaß zu ersparen kannst du mit der Funktion degtorad Gradmaß in Radialmaß umwandeln.
In deinem Timer erhöhst du einfach eine Gradzahl um 1, rechnest mit sin und cos die x und y koordinate auf dem kreispunkt aus und setzt deine ellipse an diese Stelle.
Moderiert von
Narses: BMP in GIF gewandelt.
-Nala- - Fr 02.11.07 22:34
also so ganz hab ichs immer noch nicht verstanden... was ist überhaupt sin und cos und wie bau ich das in meine unit ein??? was für eine gegenkathete... ich bin jetzt in der 10. klasse auf dem gymnasium aber ich hab noch nie sin und cos gehört... wir machen gerade kreisberechnung kann also sein das wir dieses sin und cos bald machen...
EDIT:ok sry ... hatte deine zeichnung noch nicht gesehen.. aber trotzdem irgendwie blick ich da nich durch...
Jann1k - Fr 02.11.07 22:50
Du bist in der 10. Klasse und weißt nicht was Sinus und Cosinus ist? Von Katheten und Hypothenusen hast du auch noch nichts gehört (nicht mal beim Satz des Pythagoras)? Kann ich mir nur schwer vorstellen, frag mal nen Mathe-As aus deiner Klasse.
€: Um sin und cos einzubauen binde die unit math ein (oben unter uses)
-Nala- - Fr 02.11.07 22:59
klar... von hypotenuse und kathete hab ich natürlich schon was gehört aber von sin und cos noch nicht... kannst du vielleicht einfach mal diese einbindung von sin und cos programmieren und die unit hier darstellen ??? das würde mir echt weiterhelfen..
Jann1k - Fr 02.11.07 23:17
Zitat: |
kannst du vielleicht einfach mal diese einbindung von sin und cos programmieren und die unit hier darstellen |
Klar kann ich, aber was lernst du dabei?
Zitat: |
das würde mir echt weiterhelfen.. |
das hier bestimmt auch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| unit Unit1;
interface
uses math; |
und tada in deinem quelltext kannst du dann einfach an irgendeiner (!!!) Stelle zB das hier benutzen:
Und wenn du wirklich keine Ahnung von der Sinus bzw. Cosinus Funktion hast, dann
1. frag deinen lehrer was da falsch läuft
2. lies dir den Wikipedia Artikel dazu durch (vllt bringt der was)
-Nala- - Fr 02.11.07 23:35
also... ich hab jetzt bei uses math dahingeschrieben und im timer vollgendes geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Timer1Timer(Sender: TObject); var I, top:real; begin I:=image1.top; top:=sinus(I); image1.top:=image1.Top+I; end; |
daraufhin erscheint die fehlermeldung : undefinierter begriff "sinus"
jakobwenzel - Fr 02.11.07 23:50
Jann1k hat folgendes geschrieben: |
Du bist in der 10. Klasse und weißt nicht was Sinus und Cosinus ist? |
Mir geht's genau so, 10. Klasse und "offiziell" kenn ich die noch nich.
-Nala- hat folgendes geschrieben: |
also... ich hab jetzt bei uses math dahingeschrieben und im timer vollgendes geschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Timer1Timer(Sender: TObject); var I, top:real; begin I:=image1.top; top:=sinus(I); image1.top:=image1.Top+I; end; |
daraufhin erscheint die fehlermeldung : undefinierter begriff "sinus" |
Probier mal sin anstatt sinus (und dann auch cos anstatt von cosinus)
Jann1k - Sa 03.11.07 00:22
Zitat: |
Mir geht's genau so, 10. Klasse und "offiziell" kenn ich die noch nich. |
´
Dann hat man den Lehrplan aber gewaltig umgestellt, als ich in der 10 war (omg 3 Jahre her ^^) war das schon bekannt meine das gabs in der neun.
-Nala- - So 04.11.07 20:18
also.. ich hab jeztzt die gleiche unit geschrieben nur halt mit sin anstatt sinus und es funktioniert immer noch nicht ...
jakobwenzel - So 04.11.07 20:39
Die Fehlermeldung dürfen wir nicht erfahren?
das hier haste doch bestimmt auch gemacht, oder?
Jann1k hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| unit Unit1;
interface
uses math; | |
-Nala- - Mi 07.11.07 17:48
also... ich hab alles gemacht was ihr mir gesagt habt aber trotzdem zeigt er mich noch eine Fehlermeldung an.. da heißt es incompatible types: integer and extended
hier ist die unit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Timer1Timer(Sender: TObject); var a,b:real; begin a:=+50; b:=-50;
Erde.top:=Erde.top+sin(a); Erde.Left:=Erde.left+sin(b); end; |
jakobwenzel - Mi 07.11.07 17:53
Das liegt daran, dass sin und cos eine Kommazahl zurückgeben. Und da es nun mal keine halben Pixel gibt, passt das leider nicht ganz.
Als Lösung kannst du dir eine von diesen Funktionen aussuchen: round, trunc, ceil, floor
-Nala- - Mi 07.11.07 18:03
aha... und wie muss ich diese funktion einbinden??? also wo soll ich sie hinschreiben oder finde ich das bei den eigenschaften/ereignissen??
blaueled - Mi 07.11.07 19:07
Hallo,
Delphi-Quelltext
1:
| Erde.top:=Erde.top+trunc(sin(a)); |
Du musst den rückgabewert der sin Funktion in einen integer umwandeln.
In diesem fall (trunc) werden einfach die nachkommastellen "abgeschnitten",
um zu runden nimm round().
BlaueLED
-Nala- - Mi 07.11.07 19:22
also.. wenigstens zeigt er mir jetzt keine fehlermeldung mehr an ... allerdings bewegt sich das image nur nach rechts... wisst ihr warum und wie man das problem behebt???
Fighter#1 - Mi 07.11.07 19:38
Jann1k hat folgendes geschrieben: |
Zitat: |
Mir geht's genau so, 10. Klasse und "offiziell" kenn ich die noch nich. | ´
Dann hat man den Lehrplan aber gewaltig umgestellt, als ich in der 10 war (omg 3 Jahre her ^^) war das schon bekannt meine das gabs in der neun. |
Ich weiß zwar nich aus welchem BuLand du kommst, aber bei mir in BaWü wurde erst in der 10. Klasse vor den ZKs die Trigonometrie behandelt ...
-Nala- - Mi 07.11.07 19:48
also ich komm aus Nordrhein-westfahlen...
Jann1k - Mi 07.11.07 19:54
Zitat: |
Ich weiß zwar nich aus welchem BuLand du kommst, aber bei mir in BaWü wurde erst in der 10. Klasse vor den ZKs die Trigonometrie behandelt ... |
komm aus NRW und bin noch die generation die keine ZKs erlebt hat ^^
Sinspin - Mi 07.11.07 20:40
Klar bewegt sich dein Bild nur nach rechts. Wenn es sich im Kreis bewegen soll sieht das ganze dann doch noch ein bisschen anders aus.
Wenn du dir einen Kreis anschaust, dann besteht der ja im Grunde aus einer Reihe von Punkten die so dich gesetzt sind das sie wie eine Linie wirken.
Wenn du nun einen virtuellen Punkt (deine Erde) auf dieser Punktkette wandern lassen willst musst du sie jedes mal auf einen neuen Punkt setzen!
Funktionen hattest du doch aber schon in der Schule? Sowas wie y = x+2 oder y = x^2+x?
Hier geht es ja um nichts anderes, nämlich um die Kreisfunktion. Die stellt aber eben keine gerade Linie oder Parabel dar, sondern eigentlich eine Sinuswelle - oder eben einen Kreis.
Das produziert eine Sinuswelle:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var l,x,y: integer;
for l := 0 to 360 do begin x := l; y := Round(Sin(DegToRad(l))*100); end; |
Und das wird ein Kreis.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var l,x,y: integer;
for l := 0 to 360 do begin x := Round(Cos(DegToRad(l))*100); y := Round(Sin(DegToRad(l))*100); end; |
-Nala- - So 11.11.07 00:26
also.. ich hab jetzt mal deine sachen ausprobiert.. allerdings verschwindet das image (bei der unten angegebenen unit) immer kurz nach rechts unten und erscheint dann wieder. Letztendlich ist er dann ganz verschwunden...
hier die unit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Timer1Timer(Sender: TObject); var l,x,y: integer; begin for l := 0 to 360 do begin x:=l; x := Round(Cos(DegToRad(l))*100); y := Round(Sin(DegToRad(l))*100); image1.Top:=image1.top+y; image1.left:=image1.left+x; end; end; |
Marc. - So 11.11.07 00:39
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Timer1Timer(Sender: TObject); var l,x,y: integer; begin for l := 0 to 360 do begin x:=l; x := Round(Cos(DegToRad(l))*100); y := Round(Sin(DegToRad(l))*100);
image1.Top:=image1.top+y; image1.left:=image1.left+x; end; end; |
Ich würde "L" mit Hilfe des Timers und nicht mit einer For-Schleife hochzählen lassen.
Irgendwie sowas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var l,x,y: integer; begin if (l >= 360) then l := 0;
inc(l,10);
x := Round(Cos(DegToRad(l))*10); y := Round(Sin(DegToRad(l))*10);
image1.Top:=image1.top+x; image1.left:=image1.left+y; end; |
grüße,
Marc
-Nala- - So 11.11.07 00:50
so... ich habe genau das verwendet was du geschrieben hast... trotzdem bewegt sich das image schief nach unten rechts... ich hab keine ahnung warum...
Popov - So 11.11.07 09:01
Hier ein nette Demo die langsam zeigt wie ein Kreis berechnet und gezeichnet wird. Sinus und Cosinus liefern mit ihren Y Werten die Daten für den Kreis.
Für die Demo braucht man ein leeres Formular und ein Button (Button1). Auf dem Formular werden einige Diagramme gezeichnet. Mit dem Sleep Wert (unten) kann man die Demo schneller und langsamer ablaufen lassen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115:
| procedure TForm1.Button1Click(Sender: TObject); var w, x, sinX, sinY, cosX, cosY, sinXorY, cosXorX, KreisX, KreisY: Integer;
const FX = 200; FY = 50; sinStartX = 200; sinStartY = 100; cosStartX = 100; cosStartY = 200;
procedure CanLine(Can: TCanvas; x1, y1, x2, y2: Integer); begin Can.MoveTo(x1, y1); Can.LineTo(x2, y2); end;
function mySin(PixelX: Integer; PiInPixel, OneInPixel: Word): Integer; var x: Extended; begin x := Pi * (PixelX / PiInPixel); Result := Trunc(sin(x) * OneInPixel); end;
function myCos(PixelX: Integer; PiInPixel, OneInPixel: Word): Integer; var x: Extended; begin x := Pi * (PixelX / PiInPixel); Result := Trunc(cos(x) * OneInPixel); end;
procedure XorLine(Can: TCanvas; x1, y1, x2, y2: Integer); begin with Can, TPen.Create do try Mode := Pen.Mode; Pen.Mode := pmNot; MoveTo(x1, y1); LineTo(x2, y2); Pen.Mode := Mode; finally Free; end; end;
begin with Canvas do begin FillRect(ClipRect);
MoveTo(sinStartX, sinStartY-FY); LineTo(sinStartX, sinStartY+FY); MoveTo(sinStartX, sinStartY); LineTo(sinStartX+(FX*2), sinStartY); MoveTo(cosStartX-FY, cosStartY); LineTo(cosStartX+FY, cosStartY); MoveTo(cosStartX, cosStartY); LineTo(cosStartX, cosStartY+(FX*2));
sinX := sinStartX; sinY := sinStartY; cosX := cosStartY; cosY := cosStartX; KreisY := sinY; KreisX := cosY;
for w := -FX to FX do begin XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY); XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom);
x := w; MoveTo(sinX, sinY); sinX := sinStartX + FX + w; sinY := sinStartY + mySin(x, FX, FY); LineTo(sinX, sinY);
x := w; MoveTo(cosY, cosX); cosX := cosStartY + FX + w; cosY := cosStartX + myCos(x, FX, FY); LineTo(cosY, cosX);
MoveTo(KreisX, KreisY); KreisY := sinY; KreisX := cosY; LineTo(KreisX, KreisY);
sinXorY := sinY; cosXorX := cosY; XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY); XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom);
Sleep(10); Application.ProcessMessages; end;
XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY); XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom);
end;
end; |
Andiäääh - Mi 04.02.09 21:25
Hallo zusammen,
ich habe ein ähnliches Problem, ich möchte ein Image im Kreis fliegen lassen. Habe alle hier aufgeführten Codes ausprobiert, aber bei mir bewegt sich das Image entweder nur in eine Richtung oder es bewegt sich nur einmal und bleibt dann stehen.
Mein Code sieht momentan so aus:
procedure TForm1.Timer1Timer(Sender: TObject);
var
l,x,y: integer;
begin
if l>=360 then l:=0;
inc(l,1);
x := Round(Cos(DegToRad(l))*100);
y := Round(Sin(DegToRad(l))*100);
Image1.Left:=Image1.Left+x;
Image1.Top:=Image1.Top+y;
end;
Ich finde den Fehler einfach nicht. Wäre für Hilfe sehr dankbar :)
jaenicke - Mi 04.02.09 21:38
Hallo und :welcome: im Forum! ;-)
Das liegt daran, dass l hier eine lokale Variable ist. Die hat bei dem nächsten Aufruf der Methode Timer1Timer nicht mehr den vorherigen Wert.
Entweder deklarierst du die global oder du benutzt die Tag-Eigenschaft des Images zur Speicherung der aktuellen Position (Image1.Tag).
Andiäääh - Mi 04.02.09 22:09
:) ES TUT!
ich könnt dich Knutschen, hab so ewig rumprobiert ;)
Lazarusboy - Mo 14.03.11 20:22
Wie muss man denn die Variable deklarieren?
jaenicke - Mo 14.03.11 21:04
Am besten unter private im Formular und am besten natürlich mit einem aussagekräftigen Namen.
Lazarusboy - Mo 14.03.11 21:33
Wie würde das aussehen, bin grade am probieren, verstehe aber grade nicht wie ich genau das machen soll.-)
jaenicke - Mo 14.03.11 22:56
Wie meinst du das? :gruebel:
Delphi-Quelltext
1: 2: 3:
| TMyForm = class(TForm) private MyTest: Integer; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!