Autor Beitrag
Slowmo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29

Suse Linux 10.1
Lazarus v.0.9.18
BeitragVerfasst: Mo 10.10.05 18:08 
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:
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:
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.
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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 10.10.05 18:13 
Du gibst den allokierten Speicher nachdem du reingeschrieben hast sofort wieder frei.

ausblenden 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..

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Slowmo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29

Suse Linux 10.1
Lazarus v.0.9.18
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29

Suse Linux 10.1
Lazarus v.0.9.18
BeitragVerfasst: 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?).