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

27.06.2009, 14:19

Lenkraketen

Tach Leute,

brauche Hilfe bei einem algorytmus.

Und zwar habe ich 2 Punkte auf einer Ebene ( 2D ), der eine Punkt ist konstant, der andere Punkt muss sich zu Punkt1 bewegen.
Dabei hat er eine konstante Geschwindigkeit nach vorne und kann sich pro Frame nur eine bestimme Anzahl von Grad drehen.

Könnt ihr mir helfen.
Meine ganzen selbstausgedachten Algos klappen net :/

lg

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

27.06.2009, 14:41

Naja du berechnest den Winkel zwischen aktueller Richtung und Richtung zum Punkt. Dann schaust du ob der Winkelbetrag größer ist als der maximal drehbare Winkel. Wenn ja musst du den maximalen Winkel in die entsprechende Richtung addieren. Ist der Winkelbetrag kleiner musst du nur die Differenz addieren.

3

27.06.2009, 14:44

Was genau klappt den bei deinen Algorithmen nicht?

4

27.06.2009, 14:51

Also ich hab das so gemacht (leider code gelöscht):

Punkt1 = konstant (100|100)
Punkt2 = rakete (200|200)

geschwindigkeit = 1;
maxDreh = 0.1;

neue Positionberechnen mit phytagoras.
Doch jetzt weiß ich nicht wie ich schauen soll ob er sich nach Links oder Rechts drehen soll ?
Hatte da eine kleine Rechnung ( leider gelöscht ) , doch die schien falsch zu sein.

lg

5

27.06.2009, 16:25

Mit Arcustangens kannst du dir den Winkel von einem Punkt auf einen anderen ausrechnen (Winkel des Differenzvektors). Jetzt vergleichst du diesen mit dem Winkel des Raketen-Geschwindigkeitsvektors und kannst entsprechend erkennen, ob sich die Rakete nach links oder rechts drehen soll.

6

27.06.2009, 16:30

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
float speed = 1;
    float tempx = sin(m_rot)*speed;
    float tempy = cos(m_rot)*speed; // bewegen

    
    float d1 = sqrt(pow(m_targetX-m_xPos,2)+pow(m_targetY-m_yPos,2)); // alte Position

    float d2 = sqrt(pow(m_targetX-(m_xPos+tempx),2)+pow(m_targetY-(m_yPos+tempy),2)); // neue Position

    float deg = acos(d2/d1); // links oder rechts


    m_xPos += tempy;
    m_yPos += tempx;

    if(deg < 2.0f*3.1415f*(180.0f/360.0f)) // links

    {
        m_rot -= 2.0f*3.1415f*(1.5f/360.0f);
    }
    else // rechts

    {
        m_rot += 2.0f*3.1415f*(1.5f/360.0f);
    }



wenn ich als Target 100|100 eingebe fliegt er mir woanders hin :/
wo liegt der denkfehler ?


lg

7

27.06.2009, 16:38

Nur mal so: Du könntest dein Problem massiv vereinfachen, wenn du die Möglichkeiten der Objektorientierung einsetzt und entsprechende Vektorklassen und -funktionen schreibst. Es ist auch sehr wahrscheinlich, dass du das wiederverwenden kannst. Oder mindestens deine Codeduplizierung könntest du durch Funktionen zur Abstandsberechnung, Umwandlung Grad-/Bogenmass etc. reduzieren.

Hast du bei dir geschaut, dass du Grad und Bogenmass nicht durcheinander bringst? Oder dass die y-Richtung nach oben zeigt (wegen sin())?

8

27.06.2009, 16:52

Zitat von »"Nexus"«

Oder dass die y-Richtung nach oben zeigt (wegen sin())?


Also ich denke Grad/Bogenmaß hab ich nicht vertauscht. Aber was meinst du mit y-Richtung nach oben ?

lg



C-/C++-Quelltext

1
2
3
float d1 = sqrt(pow(m_targetX-m_xPos,2)+pow(m_targetY-m_yPos,2)); // abstand zwischen alte Pos und target

    float d2 = sqrt(pow(m_targetX-(m_xPos+tempx),2)+pow(m_targetY-(m_yPos+tempy),2)); // abstand zwischen neue Pos und target

    float deg = acos(d2/d1);


ich denke hier is nen logischer Fehler :/
finde ihn aber net

9

27.06.2009, 20:24

Hab das bissel vereinfacht und mit tangens gemacht.
Klappt trotzdem nicht, wo liegt der denkfehler ?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float speed = 1;
    float tempx = sin(m_rot)*speed;
    float tempy = cos(m_rot)*speed;
    
    float lineA = distance(m_xPos+tempx, m_yPos+tempy, m_targetX, m_targetY);
    float deg = atan(speed/lineA);

    if(deg < 3.1415f)
    {
        m_rot += 0.1f;
    }
    else
    {
        m_rot -= 0.1f;
    }

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

10

28.06.2009, 10:14

hallo, am einfachsten ist das über vektoren zu lösen. weiss allerdings nicht inwieweit du dich bereits damit auskennst.

also vektoren r1,r2 und v1:
r1=vektor-koordinate von rakete
r2=ziel-koordinate

v1=geschwindigkeit deiner rakete

dann bekommst du über d1=r2-r1 den richtungsvektor zwischen rakete und ziel.
was du dann noch suchst ist der winkel zwischen dem geschwindigkeitsvektor der rakete und diesem richtungsvektor d1.
den winkel bekommst du über das skalarprodukt der beiden vektoren d1 und v1:
|d1|*|v1|*cos(a)=skalarprodukt(d1,v1)
also dann a=acos[skalarprodukt(d1,v1)/(|d1|*|v1|)];

wobei
|d1|=sqrt (d1.x*d1.x+d1.y*d1.y);
für |v1| gilt es analog (wäre bei dir aber immer 1);

skalarprodukt(v1,d1)= v1.x*d1.x+v1.y*d1.y

damit sollteste das eigentlich relativ einfach und gut hinbekommen.
schau mal bei wiki auch unter vektoren bzw. skalarprodukt. da ist das auch nochmal alles schön erklärt, falls du dich damit noch nicht auskennst.

Gruss

edit: hatte statt dem betrag die normierung eines vektors reingeschrieben, sollte aber jetzt korrekt sein.

Werbeanzeige