Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem mit Sinus, Kosinus, Arkussinus, etc.
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 13:47    Titel: Problem mit Sinus, Kosinus, Arkussinus, etc. Antworten mit Zitat

Hallo,
ich nehme mal an, dass die Meisten von euch, im gegensatz zu mir traurig , 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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 06.09.2007, 14:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 14:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 06.09.2007, 14:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 15:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 06.09.2007, 15:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 15:40    Titel: Antworten mit Zitat

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". durchgeknallt
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. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 16:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 06.09.2007, 16:47    Titel: Antworten mit Zitat

Vielleicht ist dir vorher die Rechengenauigkeit in die Quere gekommen, keine Ahnung. Aber hauptsache, es funktioniert. happy

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. lachen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 17:19    Titel: Antworten mit Zitat

Tja und so wurde mein Spiel gerettet/vor seltsamen Blickrichtungen bewahrt... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 06.09.2007, 18:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.09.2007, 21:30    Titel: Antworten mit Zitat

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. zwinkern
Grüße Caran
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.09.2007, 15:12    Titel: Antworten mit Zitat

nemored, irgend etwas stimmt mit deiner berechnung nicht.

da fehlt irgend etwas wenn es über 180 grad geht.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 07.09.2007, 15:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.09.2007, 15:22    Titel: Antworten mit Zitat

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.




grinsen faule ausrede. grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 07.09.2007, 15:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.09.2007, 15:25    Titel: Antworten mit Zitat

aber es gibt kreisausschnitte die grösser als 180 grad sind.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 07.09.2007, 15:27    Titel: Antworten mit Zitat

Nein, ein Kreisausschnitt hat einen Flächeninhalt oder meinetwegen eine Steckenlänge. Gradzahlen kenne ich nur bei Winkeln und Temperaturangaben. cool
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 07.09.2007, 18:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 07.09.2007, 19:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz