Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 13:47 Titel: Problem mit Sinus, Kosinus, Arkussinus, etc. |
|
|
Hallo,
ich nehme mal an, dass die Meisten von euch, im gegensatz zu mir , sich mit den im Titel genannten Rechenausdrücken auskennen.
Also, ich habe zwei Koordinaten (x/z) und (x1/z1). (x1/z1) beschreibt die Position des Spielers, (x/z) beschreibt die Position einer Person die sich in Richtung des Spielers drehen soll. Durch diese zwei Positionen wollte ich errechnen um wieviel Grad sich der Beobachter drehen muss um den Spieler sichtbar zu beobachten.
Hierzu habe ich eine Skizze angefertigt wie das dann aussehen sollte.
http://dateihoster.de/files/431b596a303dc222d7155905a.bmp
Nur leider funktioniert das nicht. Hier mein Code/meine Berechnung:
Code: | seitea = (spielerzpos-beobachterzpos)
seitec = sqr(((spielerxpos-beobachterxpos)^2)+(seitea^2))
grad = asin(sin(seitea/seitec))
|
Kann mir jemand helfen/ meine Berechnung korregieren oder erklären wie das funktioniert?
MfG Caran |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 06.09.2007, 14:29 Titel: |
|
|
Erst mal voraus: ASIN und SIN heben sich gegenseitig auf (Umkehrfunktion; jedenfalls innerhalb eines bestimmten Zahlenbereiches).
Eine Angabe ist noch entscheidend: Soll der Spieler auf jeden Fall (wie in der Skizze) genau nach rechts schauen? Sonst brauchst du noch einen Start-Blickwinkel oder einen weiteren Koordinatenpunkt, auf den der Spieler gerade schaut.
so, mal kurz nachgedacht:
Wenn ich mich jetzt nicht irre, müsstest du (wenn die Startblickrichtung nach rechts geht) damit hinkommen:
Code: | seitea = (spielerzpos-beobachterzpos) 'wie gehabt
seitec = SQR(((spielerxpos-beobachterxpos)^2)+(seitea^2)) 'wie gehabt
grad = ASIN(seitea/seitec) ' geändert |
Ich prüfe es noch eben nach. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 14:40 Titel: |
|
|
Ich habe grade nachgeschaut die Startblickrichtung ist Links. Allerdings kann man das doch so:
Code: | grad = ASIN(seitea/seitec) + 180 | wieder beheben oder? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 06.09.2007, 14:51 Titel: |
|
|
Achtung: Das Ergebnis von ASIN ergibt den Winkel in Bogenmaß. Du musst ihn erst noch in Gradmaß umwandeln:
Code: | grad = ASIN(seitea/seitec)*180/3.1415926 |
Das mit den +180 stimmt im Prinzip schon, hängt aber wiederum davon ab, wohin sich der Spieler genau dreht (spitzer oder stumpfer Winkel). Wenn du magst, knobel ich das noch ein bisschen aus. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 15:03 Titel: |
|
|
Der Code funktioniert, aber leider nur im geringen Maße: ich kann erst eine Drehung erkennen wenn ich das ergebnis nochmal mit ca. 100 multipliziere. Kann es sein, dass es daran liegt, dass sich der beobachter auch in Richtung Spieler bewegt? Und umso näher der Beobachter dem Spieler kommt desto schneller dreht er sich und wenn Beobachter und Spieler auf der selben stelle stehen dreht sich der Beobachter nicht mehr. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 06.09.2007, 15:20 Titel: |
|
|
Zitat: | wenn Beobachter und Spieler auf der selben stelle stehen dreht sich der Beobachter nicht mehr |
Ja, das kann ich mir gut vorstellen. Du benutzt ja die Abstände zwischen den beiden zur Berechnung. Wenn beide auf derselben Stelle stehen, dann rechnest du ASIN(0/0), was nicht definiert ist.
Ansonsten sollte die Entfernung der beiden voneinander keinen Einfluss auf den Drehwinkel haben. Bei der Drehgeschwindigkeit kommt es aber wieder darauf an, wie du die berechnest.
Falls es dich interessiert, hier noch ein Code zur Winkelbestimmung zwischen beliebigen Punkten. Der Spieler (spielerx/spielerz) schaut zuerst auf Punkt (altblickx/altblickz) und dreht sich dann zu Punkt (neublickx/neublickz). Zur Kontrolle wird der Winkel auch eingezeichnet. Allerdings wird immer der kleinere Drehwinkel bestimmt; über die Drehrichtung wird nichts ausgesagt.
Zeilen 10-12 geben übrigens eine allgemeine Abstandsbestimmung zweier Punkte im zweidimensionalen Koordinatensystem an.
Code: | screen 18
dim as short spielerx=100, spielerz=100
dim as short altblickx=40, altblickz=100
dim as short neublickx=130, neublickz=190
dim as single seitea, seiteb, seitec
dim as single grad
line(spielerx,spielerz)-(altblickx,altblickz)
line(spielerx,spielerz)-(neublickx,neublickz)
seitea = sqr((altblickx-neublickx)^2 + (altblickz-neublickz)^2)
seiteb = sqr((spielerx-altblickx)^2 + (spielerz-altblickz)^2)
seitec = sqr((spielerx-neublickx)^2 + (spielerz-neublickz)^2)
grad = acos((seiteb^2+seitec^2-seitea^2)/2/seiteb/seitec) * 180/3.1415926
print grad
sleep |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 15:40 Titel: |
|
|
Na gut, da mir das ganze etwas zu kompliziert wird belasse ich es mal auf dem Code: Code: |
seitea = (spielerzpos-beobachterzpos)
seitec = SQR(((spielerxpos-beobachterxpos)^2)+(seitea^2))
grad = ASIN(seitea/seitec)*180/3.1415926
|
Der immerhin den eindruck erweckt, dass sich der Beobachter nach dem Spieler "umsieht".
Ansonsten könnte ich das etwas einfacher machen indem ich x und x1, z und z1 vergleiche und je nach dem ob sie größer oder kleiner sind die Blickrichtung Grob anpasse.
Danke für die Hilfe, aber ich glaub das Thema ist doch etwas zu kompliziert für mich.  |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 16:19 Titel: |
|
|
Hallo,
nach noch einem Versuch bzw. einer kleinen ausbesserung hat es jetzt doch geklappt:
Code: |
seite.a = (zpos - beobachter.zpos)
seite.b = (xpos - beobachter.xpos)
seite.c = sqr((seite.b^2)+(seite.a^2))
beobachter.yrot = asin(seite.a/seite.c)*180/3.1415926 |
Wie man sieht habe ich die Berechnung zur Seite b vorher geschrieben und Arrays benutzt. Das einzige was ich jetzt nicht verstehe ist warum das vorher nicht schon geklappt hat. Im Grunde ist der neue Code ja nur geringfügig umgeformt. Wie dem auch sei, es funktioniert und das ist die Hauptsache. Und nochmal Danke.
MfG Caran |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 06.09.2007, 16:47 Titel: |
|
|
Vielleicht ist dir vorher die Rechengenauigkeit in die Quere gekommen, keine Ahnung. Aber hauptsache, es funktioniert.
Dass dir meine allgemeine Berechnung zu kompliziert vorkommt, kann ich gut verstehen. Das ist Schulstoff der 10. Klasse, und selbst da ist es für einen großen Teil zu kompliziert.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 17:19 Titel: |
|
|
Tja und so wurde mein Spiel gerettet/vor seltsamen Blickrichtungen bewahrt...  |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 06.09.2007, 18:23 Titel: |
|
|
Grundlagen zu Winkelfunktionen findest du hier
Und wenn du Winkel umwandeln möchtest, schau mal hier nach..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 06.09.2007, 21:30 Titel: |
|
|
Hi!
Oh ja, das ist auch sehr hilfreich. Ich hab auch nochmal auf Wikipedia geguckt. Und nach dieser "Fehlersuche" in meinem Programm scheinen mir diese trigonometrischen Funktionen (so heißen die doch oder?) gar nicht mehr allzu schwer.
Grüße Caran |
|
Nach oben |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.09.2007, 15:12 Titel: |
|
|
nemored, irgend etwas stimmt mit deiner berechnung nicht.
da fehlt irgend etwas wenn es über 180 grad geht.
mfg |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 07.09.2007, 15:18 Titel: |
|
|
nemored hat Folgendes geschrieben: | Allerdings wird immer der kleinere Drehwinkel bestimmt; über die Drehrichtung wird nichts ausgesagt. |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.09.2007, 15:22 Titel: |
|
|
wenn schon ein muster, dann richtig, damit keine irrtümer aufkommen.
Zitat: |
Allerdings wird immer der kleinere Drehwinkel bestimmt; über die Drehrichtung wird nichts ausgesagt.
|
wer bestimmt den grösseren drehwinkel.
faule ausrede.  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 07.09.2007, 15:24 Titel: |
|
|
Das ist keine faule Ausrede, sondern eine Folge des verwendeten Cosinussatzes. Der beschäftigt sich nun mal mit Dreiecken, und in Dreiecken gibt es keine Winkel, die größer sind als 180°. Es bleibt dir unbenommen, eine Verbesserung dazu einzustellen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.09.2007, 15:25 Titel: |
|
|
aber es gibt kreisausschnitte die grösser als 180 grad sind.
mfg |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 07.09.2007, 15:27 Titel: |
|
|
Nein, ein Kreisausschnitt hat einen Flächeninhalt oder meinetwegen eine Steckenlänge. Gradzahlen kenne ich nur bei Winkeln und Temperaturangaben.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 07.09.2007, 18:54 Titel: |
|
|
Ich weis zwar nicht ob ich richtig liege, aber ich glaube das Problem das atari anspricht, ist mir heute morgen auch schon aufgefallen: Wenn der Spieler links vom Beobachter steht, dann geht der Blick des Beobachters in eine andere Richtung. Dieses Problem lies sich bei mir allerdings so löesn:
Code: |
if beobachter.xpos < xpos then
seite.a = (zpos - beobachter.zpos)
seite.b = (xpos - beobachter.xpos)
seite.c = sqr((seite.b^2)+(seite.a^2))
beobachter.yrot = -asin(seite.a/seite.c)*180/3.1415926 + 180
else
seite.a = (zpos - beobachter.zpos)
seite.b = (xpos - beobachter.xpos)
seite.c = sqr((seite.b^2)+(seite.a^2))
beobachter.yrot = asin(seite.a/seite.c)*180/3.1415926
end if
|
Grüße Caran |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 07.09.2007, 19:04 Titel: |
|
|
Zumindest, solange der Spieler zu Beginn nach links schaut.
Die Berechnungen für seite.a, seite.b und seite.c kannst du übrigens vor den IF-Block schreiben, der ist ja in beiden Fällen identisch (macht den Code etwas kürzer) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|