Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kompatibilitäts-Probleme bei mathematischen Berechungen !(?)


Mindforce - Do 12.08.10 20:54
Titel: Kompatibilitäts-Probleme bei mathematischen Berechungen !(?)
Einen schönen guten Abend wünsche ich.

Ich habe zwei Berechnungstabellen, die mir Sinus, Cosinus etc. Funktionen berechnen.
Diese Codes sind aus 2006 - und da die Mathematik in Delphi immer weiter verstümmelt, denke ich, dass es an diesen Berechnungen liegt.
Wenn ich diese anwende, werden mir die dadurch berechneten Objekte verdreht und verzogen dargestellt. Wenn ich z.B. die Resultate auf beispielsweise >6< setze, "verkrüppeln" die Objekte noch mehr.
Nun wollte ich einmal fragen, ob irgendwas mit meinem Code nicht stimmt.



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:
unit SinCosTables;
//---------------------------------------------------------------------------
// SinCosTables.pas                                     Modified:  9-Apr-2006
//                                                               Version 0.10
//---------------------------------------------------------------------------
// Changes since v0.00:
//  + creates sin and cos tables - depend on DEFINING one of possibilities
//---------------------------------------------------------------------------
interface
(*
//{$DEFINE SINCOS_INTPREC}
//{$DEFINE SINCOS_DECPREC}
//{$DEFINE SINCOS_KILPREC}
(* *)


{$IFDEF SINCOS_INTPREC}
var
  SinInt: array[0..359of Real;
  CosInt: array[0..359of Real;
{$ENDIF}

{$IFDEF SINCOS_DECPREC}
var
  SinDec: array[0..3599of Real;
  CosDec: array[0..3599of Real;
{$ENDIF}

{$IFDEF SINCOS_KILPREC}
var
  SinKil: array[0..35999of Real;
  CosKil: array[0..35999of Real;
{$ENDIF}

implementation

{$IFDEF SINCOS_INTPREC}
procedure InitSicCos_Int();
var i: integer;
  rad, rd: Real;
begin
  rad := Pi/180;
  for i := 0 to 359 do
  begin
    rd := rad * i;
    SinInt[i] := sin(rd);
    CosInt[i] := cos(rd);
  end;
end;
{$ENDIF}

{$IFDEF SINCOS_DECPREC}
procedure InitSicCos_Dec();
var i: integer;
  rad, rd: Real;
begin
  rad := Pi/1800;
  for i := 0 to 3599 do
  begin
    rd := rad * i;
    SinDec[i] := sin(rd);
    CosDec[i] := cos(rd);
  end;
end;
{$ENDIF}

{$IFDEF SINCOS_KILPREC}
procedure InitSicCos_Kil();
var i: integer;
  rad, rd: Real;
begin              
  rad := Pi/18000;
  for i := 0 to 35999 do
  begin
    rd := rad * i;
    SinKil[i] := sin(rd);
    CosKil[i] := cos(rd);
  end;
end;
{$ENDIF}

initialization

{$IFDEF SINCOS_INTPREC}
  InitSicCos_Int();
{$ENDIF}
{$IFDEF SINCOS_DECPREC}
  InitSicCos_Dec();
{$ENDIF}
{$IFDEF SINCOS_KILPREC}
  InitSicCos_Kil();
{$ENDIF}
end.


und die zweite


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:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
unit SinCosFunctions;
//---------------------------------------------------------------------------
// SinCosFunctions.pas                                  Modified:  9-Apr-2006
//                                                               Version 0.10
//---------------------------------------------------------------------------
// Changes since v0.00:
//  + overload to sin() and cos() system function to take data from array
//    created in SinCosTables.pas
//---------------------------------------------------------------------------
interface
(* sin cos tables
//{$DEFINE SINCOS_INTPREC}
//{$DEFINE SINCOS_DECPREC}
//{$DEFINE SINCOS_KILPREC}
(* *)


{$IFDEF SINCOS_INTPREC}
function sin(angle: Real): Real;
function cos(angle: Real): Real;
{$ENDIF}

{$IFDEF SINCOS_DECPREC}
function sin(angle: Real): Real;
function cos(angle: Real): Real;
{$ENDIF}

{$IFDEF SINCOS_KILPREC}
function sin(angle: Real): Real;
function cos(angle: Real): Real;
{$ENDIF}

const
  rRad = 180/Pi;
  rRad10 = 1800/Pi;
  rRad100 = 18000/Pi;

implementation

uses
  SinCosTables;

{$IFDEF SINCOS_INTPREC}
function sin(angle: Real): Real;
var i: integer;
begin
  i := Round(angle*rRad);
  if i < 0 then
  begin
    while i < -360 do
      inc(i, 360);
    i := 360+i;
  end else
    while i > 360 do
      dec(i, 360);
  Result := SinInt[i];
end;

function cos(angle: Real): Real;
var i: integer;
begin
  i := Round(angle*rRad);
  if i < 0 then
  begin
    while i < -360 do
      inc(i, 360);
    i := 360+i;
  end else
    while i > 360 do
      dec(i, 360);
  Result := CosInt[i];
end;
{$ENDIF}

{$IFDEF SINCOS_DECPREC}
function sin(angle: Real): Real;
var i: integer;
begin
  i := Round(angle*rRad10);
  if i < 0 then
  begin
    while i < -3600 do
      inc(i, 3600);
    i := 3600+i;
  end else
    while i > 3600 do
      dec(i, 3600);
  Result := SinDec[i];
end;

function cos(angle: Real): Real;
var i: integer;
begin
  i := Round(angle*rRad10);
  if i < 0 then
  begin
    while i < -3600 do
      inc(i, 3600);
    i := 3600+i;
  end else
    while i > 3600 do
      dec(i, 3600);
  Result := CosDec[i];
end;
{$ENDIF}

{$IFDEF SINCOS_KILPREC}
function sin(angle: Real): Real;
var i: integer;
begin
  i := Round(angle*rRad100);
  if i < 0 then
  begin
    while i < -36000 do
      inc(i, 36000);
    i := 36000+i;
  end else
    while i > 36000 do
      dec(i, 36000);
  Result := SinKil[i];
end;

function cos(angle: Real): Real;
var i: integer;
begin
  i := Round(angle*rRad100);
  if i < 0 then
  begin
    while i < -36000 do
      inc(i, 36000);
    i := 36000+i;
  end else
    while i > 36000 do
      dec(i, 36000);
  Result := CosKil[i];
end;
{$ENDIF}

end.


Sorry für den Haufen von Code, aber ich habe bereits eine gesamte Engine umgeschrieben um sie auf mein Delphi 2007 zu compilen. Aber hier bleibe ich komplett drauf sitzen.
Auf jede Hilfe freue ich mich :)

Vielen Dank für's Durcharbeiten.

Mit schönen Grüßen:

-Mindforce


Mindforce - Do 12.08.10 22:08

Leute, das Problem ist gelöst.

Ich habe meine gesamte Engine nochmal komplett neu aufgesetzt und nun funktioniert es wieder einwandfrei.
An den Mathe-Funktionen liegt es also zu 98% nicht :D

Trotzdem danke :D

Also falls jemand mit dem Code Probleme haben sollte - Tipp: Neu aufsetzen, die Tables funzen ^^

Schöne Grüße von:

-Mindforce


Delete - Do 12.08.10 22:12

user profile iconMindforce hat folgendes geschrieben Zum zitierten Posting springen:
die Mathematik in Delphi immer weiter verstümmelt

Bitte wa stut die Mathematik in Delphi?

Zitat:
denke ich, dass es an diesen Berechnungen liegt.
Wenn ich diese anwende, werden mir die dadurch berechneten Objekte verdreht und verzogen dargestellt. Wenn ich z.B. die Resultate auf beispielsweise >6< setze, "verkrüppeln" die Objekte noch mehr.

Ändere den Datentyp von Real mal auf Extendet. Real gilt schon lange als depracted.

Wichtig wäre eventuell noch von was für Objekten du redest. Sind das Objekte, die du zeichnest? Wenn ja, wie werden sie gezeichnet.