Entwickler-Ecke

Sonstiges (Delphi) - Problem mit eigener Klasse


Slowmo - Mo 10.10.05 18:08
Titel: Problem mit eigener Klasse
Ich habe eine eigene Klasse gebastelt, die die funktion von Polarkoordinaten übernimmt. So möchte ich gerne etwas mit Kräften rechnen (Für ein Spiel das auf DelphiX basiert).

Soo hier meine Klasse:

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:
unit PVektor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXDraws, ComCtrls, DXClass, DXSounds, StdCtrls, DXSprite,
  DXInput, ExtCtrls, Math;

type
  TPVektor = class
  private
    Be, Wink: Real;
  public
    procedure Draw(Canvas: TDirectDrawSurfaceCanvas; x,y : Integer; Color : TColor);
    procedure AddVector(Vektor: TPVektor);
     property Betrag : Real read Be write Be;
     property Winkel : Real  read Wink write Wink;
  end;

implementation
uses Manvoever;

procedure TPVektor.Draw(Canvas: TDirectDrawSurfaceCanvas; x,y : Integer; Color : TColor);
var xVek, yVek: integer;
begin
Canvas:=Canvas.Create(Form1.DXD_Main.Surface);
XVek:=Floor(Be*cos(Wink));
YVek:=Floor(Be*sin(Wink));
With Canvas do
  begin
    Pen.Color := Color;
    Pen.Width := 2;
    MoveTo(x,y);
    LineTo(x+XVek,y+YVek);
  end;
Canvas.Free;
end;

procedure TPVektor.AddVector(Vektor: TPVektor);
var x1, y1, x2, y2, x3, y3: Real;
begin
//Wenn der Betrag kleiner null ist 360 Grad zum Winkel zuzählen
if Be<0 then
  begin
  Be:=-Be;
  Wink:=Wink+2*Pi;
  end;
if Vektor.Betrag<0 then
  begin
  Vektor.Betrag:=-Vektor.Betrag;
  Vektor.Winkel:=Vektor.Winkel+2*Pi;
  end;
//Umrechnung in Karth. Koord.
  x1:= Be*cos(Wink);
  y1:= Be*sin(Wink);
x2:= Vektor.Betrag*cos(Vektor.Winkel);
y2:= Vektor.Betrag*sin(Vektor.Winkel);
//Addieren der Vektoren
x3:= x1+x2;
y3:= y1+y2;
//Umrechnen in Polarkoordinaten
Betrag:=sqrt(sqr(x3)+sqr(y3));
Winkel:= ArcCosh(x3/Betrag);
end;

end.

Sooo nun das Problem: Die Werte meiner Kräfte nach folgender Prozedur sind immer 0 und ich versteh nicht warum.

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:
procedure Kraftberechnung();
var FMotor, FZentripetal, FReibx, FReiby, FReibRes, VAdd: TPVektor;
    Winkelgeschw: Real;
begin
//------- Instanzen erstellen: ---------------------

Fmotor :=  TPVektor.create;
FZentripetal :=  TPVektor.create;
FReibx :=  TPVektor.create;
Freiby :=  TPVektor.create;
FReibRes:= TPVektor.create;
FRes := TPVektor.Create;
VInsg:=TPVektor.Create;
VAdd:=TPVektor.Create;

//----------------Kraftberechnung---------------------

  //Lesen aus der Steuerung (noch nur Testwerte--> keine Steuerung)
  FMotor.Betrag:=3000000;
  FZentripetal.Betrag:=0;

    //Berechnung des Winkels der Motorkraft
    Winkelgeschw:=FZentripetal.Betrag/(Ship1.Masse*Ship1.Geschwindigkeit);
    FMotor.Winkel:=FMotor.Winkel+Winkelgeschw*(0.02);
    if FMotor.Winkel>(2*Pi) then FMotor.Winkel:=FMotor.Winkel-(2*Pi);
    Ship1.Angle:=Round(FMotor.Winkel*(255/(2*Pi)));

  //Berechnung des Winkels der Zentripetalkraft
  FZentripetal.Winkel:=FMotor.Winkel+(Pi/2);


    //Berechnung der Reibung
    //x-Richtung
    FReibx.Winkel:=0;
    Freibx.Betrag:=(VInsg.Betrag*(cos(VInsg.Winkel)+0.1))*Ship1.Flaeche/(200);
   //y-Richtung
  FReiby.Winkel:=Pi/2;
  Freiby.Betrag:=(VInsg.Betrag*((VInsg.Winkel)+0.1))*Ship1.Flaeche/200;

  //Reibung Gesamt
  FreibRes.Betrag:=0;
  FreibRes.Winkel:=0;
    FReibRes.AddVector(FReibx);
    FReibRes.AddVector(FReiby);

  //Resultierende Kraft
    FRes.Winkel:=0;
    FRes.Betrag:=0;
    FRes.AddVector(FMotor);
    FRes.AddVector(FZentripetal);
    FRes.AddVector(FReibRes);

//Resultierende Beschleunigung

    VAdd.Winkel:=FRes.Winkel;
    VAdd.Betrag:=((FRes.Betrag/Ship1.Masse)*0.02);

//Resultierende Geschwindigkeit

   VInsg.AddVector(VAdd);

   //Vektoren Zeichnen
   //VInsg.Draw(Form1.DXD_Main.Surface.Canvas, 100, 600, clRed);
   //FMotor.Draw(Form1.DXD_Main.Surface.Canvas, 100, 600, clYellow);
   //FZentripetal.Draw(Form1.DXD_Main.Surface.Canvas, 100, 600, clGreen);
   //FReibRes.Draw(Form1.DXD_Main.Surface.Canvas, 100, 600, clLime);
   //FRes.Draw(Form1.DXD_Main.Surface.Canvas, 100, 600, clRed);

//------- Speicher freigeben: ---------------------

Fmotor.Free;
FZentripetal.Free;
FReibx.Free;
Freiby.Free;
FReibRes.Free;
FRes.Free;
VAdd.Free;
VInsg.Free;

end;


Alpha_Wolf - Mo 10.10.05 18:13

Du gibst den allokierten Speicher nachdem du reingeschrieben hast sofort wieder frei.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//------- Speicher freigeben: ---------------------   
Fmotor.Free;   
FZentripetal.Free;   
FReibx.Free;   
Freiby.Free;   
FReibRes.Free;   
FRes.Free;   
VAdd.Free;   
VInsg.Free;   

end;


Das hier erst dann wenn du die Werte wirklich nicht mehr brauchst.. also im Close oder nachdem du die Daten woanders hin gespeichert hast..

Denke das es daran liegt..


Slowmo - Mo 10.10.05 18:51

Daran sollte (kann) es nicht liegen, da wenn ich mit die Vektoren auf eine Canvas zeichnen lasse (bevor die Werte freigegeben werden) sind die Beträge immer 0 außer ich definiere Genau davor Einen Wert für Winkel und Betrag.


Slowmo - Di 11.10.05 18:13

Sooo, ich hab jetzt in endlosen Versuchen rausgefunden das es immer am Sinus oder Cosinuns liegt.
gibt es irgendwas das man beachten muss wenn man diese aufruft (Winkel dürfen nicht über 2*Pi liegen, oder so?).