Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mai 16, 2024 12:54

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Sinus Umkehren
BeitragVerfasst: Sa Feb 13, 2010 16:43 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

heute habe ich den ersten "npc" implementiert der erstmal nicht anderes machen soll als "spawnen -> sich drehen -> und danach bewegen"

das spawnen und bewegen anhand des winkels funktioniert super aber ich habe ein problem mit dem sinus,

mein dreieck und der sinus wird so berechnet

Code:
  1. procedure MoveNPCtoWaypoint(NPC_ID : Integer);
  2. var Rotation, Hypotenuse,Ankathete, Gegenkathete, sinus : double;
  3. begin
  4.   GegenKathete := NPC.PositionX[NPC_ID] - Patrols.PositionX;
  5.   Ankathete    := NPC.PositionZ[NPC_ID] - Patrols.PositionZ;
  6.  
  7.   if GegenKathete < 0 then GegenKathete := GegenKathete *-1;
  8.   if Ankathete    < 0 then Ankathete    := Ankathete    *-1;
  9.  
  10.   Hypotenuse := sqrt((Ankathete*Ankathete) + (Gegenkathete*Gegenkathete));
  11.  
  12.   sinus := Gegenkathete/Hypotenuse;
  13.  
  14.   //Rotation :=
  15.  
  16.   if NPC.Rotation[NPC_ID] <> Rotation then NPC.Rotation[NPC_ID] := NPC.Rotation[NPC_ID] + 0.1
  17.     else begin
  18.       NPC.PositionX[NPC_ID] := NPC.PositionX[NPC_ID] - (sin(degtorad(NPC.Rotation[NPC_ID])) * timefactor);
  19.       NPC.PositionZ[NPC_ID] := NPC.PositionZ[NPC_ID] - (cos(degtorad(NPC.Rotation[NPC_ID])) * timefactor);
  20.     end;
  21.  
  22. end;


an der stelle wo ich Rotation := auskommentiert habe soll nun Rotation der Winkel zugewiesen werden der in der Variable Sinus als kommazahl vorliegt

nur hab ich keine ahnung wie ich den sinus umkehren kann (auf meinem taschenrechner geht es zwar aber in delphi is das irgendwie schwerer^^)

lg Dropye


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Sa Feb 13, 2010 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Funktionen arcsin / arccos dürften sein, was du suchst...

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Sa Feb 13, 2010 16:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du suchst eine Funktion f die das folgende macht, so dass y == x ?
Code:
  1. y = f(sin(x))


Also ich kenne mich mit Delphi nicht aus, aber in jeder guten Mathlib gibt es meist sowas wie "asin" oder "arcsin". Das gleiche gibt es für den Kosinus, also dann "acos" oder "arccos".

Diese Funktionen akzeptieren üblicherweise nur Werte zwischen -1 und 1. Außerhalb dieses Bereichs wird NaN zurückgegeben oder eine Exception geworfen. Durch Rundungsfehler erhält man aber oft Werte wie 1.0001 oder ähnlich. In so einem Fall musst du den Wert in den Bereich -1...1 clampen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Sa Feb 13, 2010 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

wenn er die Delphi-eigenen Funktionen nutz brauch er das nich machen, da übernimmt das die Funktion selbst...

MfG

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: So Feb 14, 2010 22:26 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Alternativ könntest du auch mal die Funktion atan2 probieren.

Dieser übergibst du den Vektor zwischen Spieler und Wegpunkt und sie gibt dir den Winkel dazu.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Mo Feb 15, 2010 17:53 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
so also arcsin hab ich probiert aber nach meiner rechnung kommt etwas anderes raus als mir diese funktion zurückgibt

aber das atan2 werd ich mir anschauen das klingt interessant, auch habe ich bemerkt das ich noch rausbekommen muss ob mein dreieck im ersten zweiten dritten oder vierten quadranten meines koordinatensystems liegt^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Di Feb 16, 2010 16:41 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Dropye hat geschrieben:
so also arcsin hab ich probiert aber nach meiner rechnung kommt etwas anderes raus als mir diese funktion zurückgibt

Vielleicht liegt es daran, dass du ein Ergebnis im Grad-Maß erwartest? Die Standard-Funktionen arbeiten nämlich alle mit Bogenmaß.

Gruß mrtrain


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:59, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Di Feb 16, 2010 18:24 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
öhm ja genau das is auch ne möglichkeit ich arbeite mit grad also muss ich schreiben degtorad(arcsin(Sinus)) ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Di Feb 16, 2010 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
RadToDeg anstatt DegToRad (Deg = Degree = Gradmaß, Rad = Radiant = Bogenmaß)

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Mi Feb 17, 2010 00:32 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ahh ok nun haben wa eine zahl zwischen 1 und 360 das is schonmal gut^^

in diesem forum fehlt die danke-funktion^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Mi Feb 17, 2010 00:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Die gibt es. Sie besteht aus zwei Teilen.
1. ändert man den Threadtitel zu "[gelöst] Sinus umkehren".
2. sagt man einfach "Danke". :mrgreen:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Mi Feb 17, 2010 04:35 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
hehe ja ;)

ich würd schon gern gelöst drüberschreiben aber irgendwie will das nich so

ich schreib das mal mit meinem rechenbeispiel und dem aktuellem code auf

also zuerst der code

Code:
  1. procedure MoveNPCtoWaypoint(NPC_ID : Integer);
  2. var Rotation, Hypotenuse,Ankathete, Gegenkathete, sinus: double;
  3. begin
  4.   GegenKathete := NPC.PositionX[NPC_ID] - Patrols.PositionX;
  5.   Ankathete    := NPC.PositionZ[NPC_ID] - Patrols.PositionZ;
  6.  
  7.   Hypotenuse := sqrt((Ankathete*Ankathete) + (Gegenkathete*Gegenkathete));
  8.  
  9.   sinus := Gegenkathete/Hypotenuse;
  10.  
  11.   Rotation := RadToDeg(arcsin(sinus));
  12.  
  13.   if Rotation < 0 then Rotation := Rotation*-1;
  14.  
  15.   if Ankathete > 0 then begin
  16.     if Gegenkathete > 0 then
  17.         NPC.Rotation[NPC_ID] := Rotation + 270;
  18.     if Gegenkathete < 0 then
  19.         NPC.Rotation[NPC_ID] := Rotation + 180;
  20.   end
  21.   else begin
  22.     if Gegenkathete > 0 then
  23.         NPC.Rotation[NPC_ID] := Rotation;
  24.     if Gegenkathete < 0 then
  25.         NPC.Rotation[NPC_ID] := Rotation + 90;
  26.   end;
  27.  
  28.  
  29.   if NPC.CurrentSpeed[NPC_ID] < 79 then NPC.SpeedEvent[NPC_ID] := NPC_SPEED_UP_LOW;
  30.  
  31.   NPC.PositionX[NPC_ID] := NPC.PositionX[NPC_ID] - (((sin(degtorad(NPC.Rotation[NPC_ID])) * NPC.CurrentSpeed[NPC_ID]/10)) * TimeFactor);
  32.   NPC.PositionZ[NPC_ID] := NPC.PositionZ[NPC_ID] - (((cos(degtorad(NPC.Rotation[NPC_ID])) * NPC.CurrentSpeed[NPC_ID]/10)) * Timefactor);
  33.  
  34. end;


die bedeutung der variablen sollte denke ich klar sein, außer evtl "NPC_SPEED_UP_LOW" das ist aber ein Event-Flag das gesetzt wird um es anderswo zu nutzen

ok dann mal die rechnung anhand von zahlen

Code:
  1.  
  2.   GegenKathete :=  4000 - 5000;
  3.   Gegenkathete  = -1000;
  4.  
  5.   Ankathete      := (-5000) - 9000;
  6.   Ankathete       = -14000
  7.  
  8.   Hypotenuse := sqrt((-14000*-14000) + (-1000*-1000));
  9.   Hypotenuse  = 14035.668;
  10.  
  11.   sinus := -1000/14035.668;
  12.   sinus  = -0.071247054
  13.  
  14.   Rotation := sin*-1(sinus) // das soll jetzt mal die umkehrfunktion darstellen
  15.   Rotation  = -4.08561701
  16.  
  17.  Ankathete < 0 und Gegenkathete < 0
  18.   Rotation := Rotation +90
  19.   Rotation = 85.91438299 
  20.  


bow...

nachdem ich das jetzt alles aufgeschrieben hab merk ich grad das ich genau da rauskomm wo mein progam auch landet...

ich habs 100 mal durchgerechnet und erst jetzt merk ich das, aber wo liegt mein fehler? laut den koordinaten müsste eine rotation von knapp unter 180 rauskommen

um nochmal diesen part zu beschreiben

Code:
  1.   if Ankathete > 0 then begin
  2.     if Gegenkathete > 0 then
  3.         NPC.Rotation[NPC_ID] := Rotation + 270;
  4.     if Gegenkathete < 0 then
  5.         NPC.Rotation[NPC_ID] := Rotation + 180;
  6.   end
  7.   else begin
  8.     if Gegenkathete > 0 then
  9.         NPC.Rotation[NPC_ID] := Rotation;
  10.     if Gegenkathete < 0 then
  11.         NPC.Rotation[NPC_ID] := Rotation + 90;
  12.   end;


hier wird gescheut wie das dreieck welches ich in den raum lege gedreht ist oder wenn mann es so sagen will in welchen quadranten sich mein winkel befindet den ich ausrechne, je nach dem wo er liegt wird eine gewisse gradzahl dazuaddiert um auch wirklich in diesen quadranten zu landen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Mi Feb 17, 2010 11:51 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Der richtige Winkel den du suchst ist etwa 265° und um dir zu erklären, wie ich dran gekommen bin mal gerade mein Code um Winkel zu bestimmen:

Code:
  1.  
  2. function Angle2Vf(pVector1, pVector2: TVector2f): Single;
  3. begin
  4. Result := ArcCos((pVector1.Norm * pVector2.Norm));
  5. if (pVector1 + pVector2).Y < 0 then Result := 2 * Pi - Result;
  6. end;
  7.  


TVector2f.Norm liefert den normierten Vektor, also alle Komponenten einmal durch die Länge des Vektors geteilt.
In der ersten Zeile taucht ein Skalarprodukt auf, zu berechnen wie folgt:
Code:
  1.  
  2. class operator TVector2f.Multiply(P1, P2: TVector2f): Single;
  3. begin
  4. Result := P1.X * P2.X + P1.Y * P2.Y;
  5. end;
  6.  


Der zweite Vektor, also der Vergleichsvektor ist bei dir die x-Achse, wenn ich dich richtig verstehe, also (1, 0), damit vereinfacht sich die obere Funktion schlichtweg zu...

Code:
  1.  
  2. function Angle2Vf(pVector1, pVector2: TVector2f): Single;
  3. begin
  4. Result := ArcCos(pVector1.Norm.X);
  5. if pVector1.Y < 0 then Result := 2 * Pi - Result;
  6. end;
  7.  


Ob du tatsächlich noch normieren musst weiß ich nicht genau, ich gehe eigentlich nicht davon aus.
Achja, X ist die Ankathete, Y die Gegenkathede (die Richtigkeit meiner Aussagen ist daran geknüpft, dass ich dich richtig verstanden habe, ich gehe aber mal davon aus)
Die Funktion liefert das Ergebnis im Bogenmaß, aber RadToDeg kennst du ja ;)

P.S.: Während ich die Antwort geschrieben habe, hab ich in meinem Code noch nen Fehler gefunden, wenn der Vergleichsvektor nicht (1, 0) ist, ist das Ergebnis schlichtweg nicht richtig :D Da werd ich mich wohl heute abend dann dran setzen ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Do Mär 18, 2010 13:17 
Offline
DGL Member

Registriert: So Feb 07, 2010 21:15
Beiträge: 30
das hat jetzt zwar wenig mit dem Thema zu tun aber Dropye kannst du mir mal zeigen was die Funktion NPC_SPEED_UP_LOW macht?
Ist nur interessehalber :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sinus Umkehren
BeitragVerfasst: Do Mär 18, 2010 16:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Eine derartige Namensschreibweise verwendet man üblicherweise bei Konstanten. Ich würde also mal behaupten NPC_SPEED_UP_LOW ist eine Konstante. (Das ist eine Sache die mich an Delphi/Pascal ziemlich stört...man kann bei parameterlosen Funktionen die Klammern weglassen...naja...bin mehr der C++/Java-Typ)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.026s | 17 Queries | GZIP : On ]