Du bist nicht angemeldet.

Werbeanzeige

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

30.01.2011, 14:13

Winkel zwischen Zwei Punkten berechnen

Sehr geehrtes Forum, ich habe mal wieder ein Problem :
Ich bin gerade am schreiben einer Methode, die den Winkel zwischen Zwei Punkten zurückliefern soll (stellt euch vor, man verbindet beide Punkte mit einer Linie, und misst dann den Winkel zwischen dieser Linie und einer horizontalen Linie die den einen Punkt schneidet).

Leider kommt die Rückgabe 0 raus, warum?
Was mache ich den falsch, bei den 2 Punkten :
P1(0,0)
P2(20,20)

müsste demnach ein Winkel von 45° rauskommen, was aber leider nicht passiert.

Ich verstehe nicht was ich falsch mache :(.

C-/C++-Quelltext

1
2
3
4
5
6
    double getAngle(Point& p1,Point& p2)
    {
        // cos(alpha) = a / b
        // -> arccosinus(a/b) = alpha
        return acos((p1.x-p2.x)/(p1.y-p2.y));
    }

Acos ist doch die umkehr operation von cosinus oder?

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

2

30.01.2011, 14:17

Das Ergebnis is schon korrekt, du benutzt nur eine falsche Formel.

§acos \left( \frac{\vec{a} \star \vec{b}}{|\vec{a}|\star|\vec{b}|} \right)§

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

3

30.01.2011, 14:20

Verstehe ich jetzt nicht, ok, ich habe sie geändert, und abs, also den Betrag einer Zahl, eingebracht :

C-/C++-Quelltext

1
        return acos(abs(p1.x-p2.x)/abs(p1.y-p2.y));


Aber deine Formel verstehe ich überhaupt nicht,... ?(
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

4

30.01.2011, 14:24

§\vec{a} \star \vec{b}§ ist das Skalarprodukt der Vektoren.

Und §|\vec{a}|§ ist nicht der "Betrag" vom Vektor sondern gibt die Länge an, ergo:

§|\vec{a}| = \sqrt[2]{x^2 + y^2 + z^2}§ im Falle eines 3D-Raumes.

Edit: Sehe gerade du bist vermutlich nur im 2D space, also §|\vec{a}| = \sqrt[2]{x^2 + y^2}§.

Fred

Supermoderator

Beiträge: 2 130

Beruf: Softwareentwickler

  • Private Nachricht senden

5

30.01.2011, 14:31

Also ich würde vorschlagen, den Tangens zu verwenden. Zeichne dir die zwei Punkte mal in ein Koordinaten-System und schau dir an, welchen Winkel du berechnen willst. Dann solltest du recht schnell darauf kommen, dass gilt:
§\alpha = \arctan(\frac{y2-y1}{x2-x1})§

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

6

30.01.2011, 14:33

Ok, ich sag nur mal so viel dazu :
Ich habe mich noch nie mit Skalarprodukten beschäftigt,
nur auf Wikipedia stand, dass auf vielen Taschenrechnern, sowie auch auf meinem, gibt es eine Taste,
z.B: sin(hoch)-1 oder cos, tan ....
Und mit denen kann man sin und so umkehren.

Bei Wikipedia stand dann, dass diese eigentlich die Arkusfunktionen sind,
ich dachte deshalb das ich einfac accos oder so nehmen könnte, kann mir einer sagen, wie ich das in C++ machen kann?

PS:
Ja es geht (vorerst) nur um den 2D Raum
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

7

30.01.2011, 14:35

Also ich würde vorschlagen, den Tangens zu verwenden. Zeichne dir die zwei Punkte mal in ein Koordinaten-System und schau dir an, welchen Winkel du berechnen willst. Dann solltest du recht schnell darauf kommen, dass gilt:
§\alpha = \arctan(\frac{y2-y1}{x2-x1})§

Och ich Idiot! Ich habe oben auch Tangens gemeint, aber Cosinus benutzt,^^,
gut ich probiere mal deinen Vorschlag umzusetzten
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

8

30.01.2011, 14:38

C-/C++-Quelltext

1
return atan(abs(p1.y-p2.y)/abs(p1.x-p2.x));

Da kommt trotzdem nichts gescheites dabei raus, sondern nur eine 0.Komma Zahl,
warum ?

p1.y-p2.y ist ja quasi in einem Dreieck, bei dem der rechte winkel bei B liegt, die Strecke BC, und p1.x-p2.x die Streche AB.

was mache ich falsch?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

9

30.01.2011, 14:41

Vorsichtshalber: Du weißt das hier mit Bogenmas, nicht mit Grad gemessen wird?
Zum umwandeln:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
namespace math 
{
    const double PI(3.14159265);

    const double toDegree(const double radian) 
    { return radian * 180.0 / PI; }
    
    const double toRadian(const double degree) 
    { return degree * PI / 180.0; }
}; // math



Steigung bzw. Steigungswinkel lässt sich auch einfach durch arctan((y2-y1)/(x2-x1)) berechnen:

C-/C++-Quelltext

1
2
3
#include <cmath> // std::atan
const double tilt(Point const& lhs, Point const& rhs) 
{ return std::atan((lhs.y - rhs.y) / (lhs.x - rhs.x)); }



Zum Testen:

C-/C++-Quelltext

1
int main() { std::cout << "Grad: " << math::toDegree(tilt(Point(1, 0), Point(0, 1))) << std::endl; } 
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Fred

Supermoderator

Beiträge: 2 130

Beruf: Softwareentwickler

  • Private Nachricht senden

10

30.01.2011, 14:42

Stichwort Bogenmaß
Siehe hierzu auch: http://www.cplusplus.com/reference/clibrary/cmath/atan/

Edit: Zu langsam ;)

Werbeanzeige