Autor Beitrag
MoD17
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 36

WinXP, RedHat 9
D7 pers, D6 pers
BeitragVerfasst: Mi 20.10.04 22:19 
hi
wir haben in informatik die aufgabe bekommen, ein kleines planetensystem (2d) mit canvas zu zeichnen, zuerst mal eine sonne und einen planeten
soweit so gut, ist noch kein problem
doch der planet soll sich auch bewegen, das heisst in form-farbe übermalen und dann irgendwo daneben neu zeichnen, wär auch kein problem, wenn er dabei keine kreisbahn beschreiben sollte
frage: wie bekomme ich die koordinaten raus, mit denen der planet neu gezeichnet werden soll? hab mal nen freund gefragt, der meinte :
Zitat:
merkur.y = sonne.y - wurzel aus [merkur.abstand²-(sonne.x-merkur.x)²]

musst halt vorher etwas schreiben, wie: inc(merkur.x,v)

das hab ich dann mit nem timer so umgesetzt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Timer1Timer(Sender: TObject);

begin
  planet.hide;
  inc(planet.x,planet.v);
  planet.y:=round(sonne.y-(SQRT((planet.abstand*planet.abstand)-(sonne.x-planet.x)*(sonne.x-planet.x))));
  planet.show;

end;

die ausgangsposition des planeten ist (sonne.x | sonne.y-planet.abstand), also senkrecht über der sonne, da der punkt (sonne.x | sonne.y) der mittelpunkt der sonne ist
das dumme ist nur, dass das nur für etwas mehr als ein viertel der bahn funktioniert(dreht sich im uhrzeigersinn um die sonne) und der planet dabei noch schneller wird

gruss & schonmal danke

MoD17
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Do 21.10.04 00:32 
Nach einer ViertelRunde kehren sich die Vorzeichen!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
ystep:=SQRT ((planet.abstand*planet.abstand)-(sonne.x-planet.x)*(sonne.x-planet.x));
if merkur.y>0 then merkur.y:=merkur.y-ystep else merkur.y:=merkur.y+step;
xstep:=SQRT ((planet.abstand*planet.abstand)-(sonne.y-planet.y)*(sonne.y-planet.y));
if merkur.x>0 then merkur.x:=merkur.x-xstep else merkur.x:=merkur.x+xstep;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
MoD17 Threadstarter
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 36

WinXP, RedHat 9
D7 pers, D6 pers
BeitragVerfasst: Do 21.10.04 15:12 
hmm
irgendwie klappt das nicht....hab probiert und gerätselt, aber es will immer noch nicht.
stattdessen bekomme ich folgende fehlermeldung: "im projekt projekt1.exe ist eine exception der klasse einvalidop aufgetretet. meldung: #ungültige gleitkommaoperation'`. [...]"
und zwar sofort nachdem ich nen button zum start des umlaufs drücke
vielleicht liegt der fehler auch bei mir, aber ich finde ihn nicht...
habs folgendermassen umgesetzt ("merkur" ist bei mir einfach nur "planet"):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Timer1Timer(Sender: TObject);

begin
  planet.hide;
  planet.ystep:=round(SQRT (abs((40000)-(sonne.x-planet.x)*(sonne.x-planet.x))));
  if planet.y>0 then planet.y:=planet.y-planet.ystep else planet.y:=sonne.y+planet.ystep;
  planet.xstep:=round(SQRT (abs((40000)-(sonne.y-planet.y)*(sonne.y-planet.y))));
  if planet.x>0 then planet.x:=planet.x-planet.xstep else planet.x:=sonne.x+planet.xstep;
  planet.show;
end;


falls noch jemand wissen will, woher die variablen kommen:
ausblenden volle Höhe 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:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
  TKreis = class
      x,y,r: word;
      Farbe: longint;

      procedure show;
      procedure hide;
  end;

  TPlanet = class
    x,y,r,v,abstand: word;
    farbe: longint;
    phi: word;
    xstep, ystep: word;


    procedure show;
    procedure hide;

  end;


gruss
MoD17


Zuletzt bearbeitet von MoD17 am Do 21.10.04 17:00, insgesamt 1-mal bearbeitet
kachel81
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63



BeitragVerfasst: Do 21.10.04 16:01 
Da Du nirgendwo dividierst, wird das Problem vielleicht beim SQRT() auftreten, weil man aus einer nagativen Zahl keine Wurzel ziehen kann. Mußt noch den Absolutwert Abs() bilden.
MoD17 Threadstarter
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 36

WinXP, RedHat 9
D7 pers, D6 pers
BeitragVerfasst: Do 21.10.04 16:56 
stimmt, kann man nicht
hab ich geändert (auch oben im code )
aber jetzt verschwindet der planet und wird nicht neu gezeichnet
am timer liegts nicht, hab dieselbe prozedur mal ohne timer mit nem button aufgerufen, gleiches ergebnis
ich komme einfach nicht weiter...zum glück hab ich ferien und deshalb noch zeit, aber ich hätte es schon gerne fertig...

gruss
MoD17