0

私はかなり長い間この問題に悩まされてきました。

iOSでカスタムナビゲーションアプリケーションを構築しています。CLLocationsの配列があるので、配列0で最後の2つの座標を取得し、それらの方位を取得します。次に、配列1で最初の2つの座標の方位を取得します。縦座標。

次に、現在オンになっているパス(この場合はパス0)に対するターンの角度を計算したいので、ユーザーがどちらの方向にターンしているかを把握できます。

私はここで見つかったかなりの数の方法を試しましたが、成功しませんでした。誰かにヒントや推奨事項があります

私がやろうとしていることの図。

どんな助けでも大歓迎です、ありがとう!

更新:コメントを読んだ後、私は戻って、それが正しいと確信していたのでもう一度見ました、私のポイントが間違って保存されていて、私が使用していた方法が正しいことがわかりました!

私にとって最も効果的なのは、両方のパスの方位を取得し、前のパスから現在のパスの方位を取得し、このガイドラインに従うことでした。

if(self.turnAngle <= 165){
    self.turnString = LEFT;
}else if( self.turnAngle >= 165 && self.turnAngle <= 205 ){
    self.turnString = STRAIGHT;
}else if( self.turnAngle >= 205 ){
    self.turnString = RIGHT;
}
4

2 に答える 2

0

更新:コメントを読んだ後、私は戻って、それが正しいと確信していたのでもう一度見ました、私のポイントが間違って保存されていて、私が使用していた方法が正しいことがわかりました!

私にとって最も効果的なのは、両方のパスの方位を取得し、前のパスから現在のパスの方位を取得し、このガイドラインに従うことでした。

 float previousPathBearing = //get bearing
 float currentPathBearing = //get bearing
 float angle = previousPathBearing - currentPathBearing;
 angle = angle<0?-angle:angle;


if(angle<= 165){
    //LEFT;
}else if( angle>= 165 && angle <= 205 ){
    //STRAIGHT;
}else if( angle >= 205 ){
    //RIGHT;
}

私はかなり疲れているので、タイプミスや愚かな間違いを許さなければなりませんが、これは私にとってはうまくいきました!

于 2013-02-03T18:04:39.283 に答える
0

私があなたを正しく理解している場合、パス1に2つのポイント(p1_x1、p1_y1、およびp1_x2、p1_y2と呼びます)とパス2に2つのポイント(p2_x1、p2_y1およびp2_x2、p2_y2と呼びます)があり、パス間の角度?

これは難しいことではありません。この関数を使用してatan2、パス1とパス2の絶対角度を見つけ、一方の角度をもう一方の角度から減算します。

つまり、コードは次のようになります。

float anglePath1Radians = atan2(p1_y2 - p1_y1 / p1_x2 - p1_x1);
float anglePath2Radians = atan2(p2_y2 - p2_y1 / p2_x2 - p2_x1);

float angleDifferenceRadians = anglePath1Radians - anglePath2Radians;

この結果はおそらくラジアンで表示されるため、度に変換する必要があることに注意してください。

別の方法

ドット(別名スカラー)積を使用して、逆コサインを取ることで角度を見つけることができます。

float path1Dx = p1_x2 - p1_x1;
float path1Dy = p1_y2 - p1_y1;

float path2Dx = p2_x2 - p2_x1;
float path2Dy = p2_y2 - p2_y1;

float path1Magnitude = sqrt(path1Dx * path1Dx + path1Dy * path1Dy);
float path2Magnitude = sqrt(path2Dx * path2Dx + path2Dy * path2Dy);

float dotProduct = path1Dx * path2Dx + path1Dy * path2Dy;

float angleDifferenceRadians = acos(dotProduct / (path1Magnitude * path2Magnitude));
于 2013-02-03T14:05:01.570 に答える