2016-06-25 22 views
2

Ich habe Winkel, Länge der Linie und Startpunkt gegeben und ich möchte Zielpunkt berechnen, um mein Objekt hier zu bewegen. Ich folge diesen Beitrag und einige andere:Zielpunkt berechnen, Anfangspunkt, Winkel und Länge GEHEN ZUR GEGENWÄRTSRICHTUNG

cocos2d calculate destination point given start point, angle and distance

Problem: Für den ersten und vierten Quadranten, es mir richtigen Winkel ist zu geben. Aber für den 2. und 3. Quadranten geht es genau entgegengesetzt. Ich konnte das Problem nicht herausfinden. Dieses Bild kann es deutlich machen:

enter image description here

Grüne Pfeile sind meine beabsichtigte Richtung zeigen und rote Pfeile zeigen, wo es eigentlich gehen.

Mein Code so weit:

float m = (targetPosition.y - initialPosition.y)/(targetPosition.x - initialPosition.x); 
    angle = atan (m) * 180/PI; 
    int lineLength = 200; 
    float radiansAngle = CC_DEGREES_TO_RADIANS(angle); 

    Vec2 endPoint; 
    endPoint.y = sinf(radiansAngle) * lineLength + initialPosition.y; 
    endPoint.x = cosf(radiansAngle) * lineLength + initialPosition.x; 

Antwort

2

Beachten Sie, dass die roten und grünen Vektoren die gleiche m, so den Code welchen Sie meinen in jedem Fehlerfall, erraten nicht haben können.

Sie können mehr Code schreiben, um den Quadranten zu erkennen und π entsprechend addieren oder subtrahieren. Oder benutzen Sie einfach atan2.

+0

ATA2 ist auch nicht working.I wie dieser Schwimmer hat Xdiff = targetPosition.x - initialPosition.x; float yDiff = Zielposition.y - Zielposition.y; Rückgabe atan2 (yDiff, xDiff) * 180/PI; – Itkrux

+0

@Nargis 'atan2' funktioniert. Überprüfen Sie Ihre eigenen Fehler und überlegen Sie, welchen Bereich atan2 in Ihrer Sprache zurückgibt (0..2Pi oder -Pi..Pi) – MBo

1

Ich denke, Ihr Problem ist mit der Periodizität der Bräune-Funktion. Sie müssen berechnen, in welchem ​​Quadranten Sie sind.

Ich produzierte etwas Ähnliches eine Weile zurück aber ein wenig anders für openscad. Sie können es möglicherweise an Ihre Bedürfnisse anpassen. Ich habe die relevante Zeile hervorgehoben. Ich benutze Asin, aber ähnliche Prinzipien gelten.

module ql (x1,y1,x2,y2,w,thickness=2){ 
    length=sqrt(pow((x1-x2),2)+pow((y1-y2),2)); 
    //Next line corrects the angle for quadrant 
    ang=((x2-x1)<0)?180-asin((y2-y1)/length):asin((y2-y1)/length); 
    translate([x1,y1,0]){ 
    rotate([0,0,ang]){ 
     translate([0,-w/2,0]){ 
     scale([length,w,thickness]){ 
      cube(1); 
     } 
     } 
    } 
    } 
}