Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.02.2016, 17:00

[SFML] Position eines Punktes anhand eines Winkels und einem anderen Punkt ermitteln.

Hi

Ich wollte eine Funktion schreiben mit der man die Positionen eines Punktes anhand eines anderen Punktes, eines Winkels und einer Länge errechnen kann. Also so eine Art Raycasting.

Die Funktion:

(Link)


Hier der Code wo ich diese Funktion angewendet habe:

(Link)


Mein Problem ist jetzt das die acht Kreise die ja jetzt geziechnet werden nicht in den gleichen Abständen stehen. Sie sollten ja alle einen Abstand von 45° haben. Aber manche Kreise sind stark in der Nähe von anderen.

Hier wie es aussieht:

(Link)


Wie man sehen kann befinden sich zwei der Kreise von den acht Kreise nicht im richtigen Abstand zu den anderen Kreisen. Ich möchte euch fragen warum das so ist. Ich habe selbst schon einiges probiert und auch schon im Internet gesucht aber keine passende Antwort dazu funden und hoffe das jemand der ein besseres mathematisches Verständnis als ich habe mir sagen kann was ich falsch gemacht habe.

Mfg :)

EDIT: Auf dem zweiten Bild fehlt die Definition der "circleAngle" Variable. Die ist am Anfang auf -45f gestellt da mit die erste Addition von 45, 0 ergibt. Weil der erste Kreis bei 0/360° gezeichnet werden soll.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.02.2016, 17:14

Sin und Cos arbeiten mit Winkeln im Bogenmaß. Du arbeitest aber im Gradmaß.

Es ist übrigens nicht so gut in der For-Schleife mit einem Floatwert (8f) zu vergleichen, wenn Du eigentlich mit Integern arbeitest.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

06.02.2016, 17:25

Ok danke schon mal für deine Hilfe.
Ich habe im Internet gesehen wie man Bogenmaß zu Gradmaß umrechen kann. (180 / Math.PI)

Ich habe auch meine Funktion überarbeitet:
VORHER:
retVector.X += (float)(Math.Cos(angle)) * distance;
retVector.Y += (float)(Math.Sin(angle)) * distance;

NACHHER:
retVector.X += (float)(Math.Cos(angle) * (180 / Math.PI)) * distance;
retVector.Y += (float)(Math.Sin(angle) * (180 / Math.PI)) * distance;

Allerdings ist jetzt das Problem das gar keine Kreise mehr angezeigt werden.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

06.02.2016, 17:29

Du willst aber nicht von Bogenmaß zu Gradmaß umrechnen, sondern von Gradmaß zu Bogenmaß. Außerdem rechnest Du da aktuell keine Winkel um, sondern den Radius. Ist also klar, dass Du keine Kreise mehr siehst, die sind sonst wie weit nach außen verschoben worden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

06.02.2016, 17:35

Ok danke für deine Hilfe.

Ich habe grad selbst herausgefunden das der Fehler wohl bei der Erhöhung der Variable "circleAngle" liegt. Statt +45 hab ich jetzt +45 / (180 / Math.PI). Und das funktioniert.

Danke :thumbup:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

06.02.2016, 19:32

Du hättest auch innerhalb der PositionFromAngle-Methode die Umrechnung mit angle/180*PI machen können. Aber letztlich egal wo, solange es im Bogenmaß ist. Vorher hast Du halt nicht den Winkel umgerechnet, sondern das Ergebnis der Sin/Cos Funktionen damit multipliziert. Du musst aber natürlich den Winkel, also den Eingangswert für die Funktionen umrechnen, nicht deren Ergebnis.
Sprich:
retVector.X += (float)(Math.Cos(angle * Math.PI / 180)) * distance;
statt
retVector.X += (float)(Math.Cos(angle) * (180 / Math.PI)) * distance;
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige