Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - problem mit planetensystem: koordinaten


MoD17 - Mi 20.10.04 22:19
Titel: problem mit planetensystem: koordinaten
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:

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 - Do 21.10.04 00:32

Nach einer ViertelRunde kehren sich die Vorzeichen!


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 - 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"):

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:

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


kachel81 - 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 - 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