2016-06-25 6 views
2

角度、行の長さ、開始点を指定しました。ここでオブジェクトを移動するために目標点を計算します。私は、この記事や他のいくつかを以下のよ:開始点、角度、長さを指定してターゲット点を計算する逆方向に移動する

cocos2d calculate destination point given start point, angle and distance

問題:第1回と第4象限のために、それは私に正しい角度を与えています。しかし、第2象限と第3象限については、正反対の方向に向いています。私は問題を理解することができませんでした。この画像は、それを明確にすることがあります。

enter image description here

緑の矢印は、私の意図した方向を示しているし、それが実際にどこに行く赤い矢印が表示されます。これまで

私のコード:それぞれの障害の場合には、赤と緑のベクトルが同じmを持っていることを

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; 

答えて

2

お知らせ、そうコードは1あなたが意味を推測することはできません。

象限を検出し、それに応じてπを加算または減算するコードをさらに書くことができます。またはatan2を使用してください。

+0

ata2も動作していません。このfloatが好きでした。xDiff = targetPosition.x - initialPosition.x; float yDiff = targetPosition.y - targetPosition.y; return atan2(yDiff、xDiff)* 180/PI; – Itkrux

+0

@ Nargis 'atan2'は動作します。自分の間違いをチェックし、あなたの言語で 'atan2'が返す範囲(0..2Piまたは-Pi..Pi)を考慮してください。 – MBo

1

あなたの問題はtan機能の周期性にあると思います。

私は同じようなものを作り出しましたが、後は少し違いましたが、openscadでは少し違いました。あなたはあなたのニーズにそれを適応させることができるかもしれません。私は関連する行を強調表示した。私はasinを使用しますが、同様の原則が適用されます。

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); 
     } 
     } 
    } 
    } 
} 
関連する問題