Autor Beitrag
Mindforce
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 358

Win XP Pro / MCE, Win 98, Slax (Linux)
Delphi 07 PRO, Delphi 3+7 (mit Prdx)
BeitragVerfasst: Do 12.08.10 20:54 
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.


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

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

_________________
Our force; in mind.


Zuletzt bearbeitet von Mindforce am Do 12.08.10 22:08, insgesamt 1-mal bearbeitet
Mindforce Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 358

Win XP Pro / MCE, Win 98, Slax (Linux)
Delphi 07 PRO, Delphi 3+7 (mit Prdx)
BeitragVerfasst: 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

_________________
Our force; in mind.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.