右手系と左手系が違うと何が問題か
はじめに
三次元の座標系には、軸の方向の違いで「右手系」と「左手系」があります。空間参照系では、右手系に基づく座標系と、左手系に基づく座標系のどちらも出てきます。
ここでは、右手系と左手系があることと、しっかり識別しないと困ることとを紹介します。
Z軸は鉛直上向き固定で考えてください
二次元の空間参照系なのに、三次元の座標系とか言ってるのに違和感を覚えるかもしれません。
Z軸は鉛直上向きで固定されていていると考えてください。そして、私たちは上方から鉛直下向きにX軸とY軸とからなる面を見ていると考えてください。
右手系と左手系
右手系(東、北の順(経度緯度の順))
右手系の軸は斜め上から見たら次の図のようになります。
右手系を真上から見たら次のようになります。
フレミング右手の法則を思い出して下さい。
親指、人差し指、中指の順でX, Y, Zを割り当てます。これが右手系です。
手首をねじって、Z(中指)を鉛直上向きにして下さい。続いて、X(親指)を右方向に向けてください。そうすると、Y(人差し指)は、自然と、奥の方向を向いていると思います。繰り返しますが、これが右手系です。
もしくは、右手系に出てる図の「右手系」と説明されている図に、親指(X)、人差し指(Y)、中指(Z)を割り当ててみて下さい。「右手系」と説明されている図ならうまくいくと思いますが、「左手系」と説明されている図は残り一つの軸が反対になると思います。たびたびですが、これが右手系です。
東、北の順(経度緯度の順)は、右手を使って、親指(X)が東、人差し指(Y)が北を向くようにすると、中指(Z)が鉛直上向きになっていると思います。よって、右手系です。
左手系(北、東の順(緯度経度の順))
左手系の軸は斜め上から見たら次の図のようになります。
左手系を真上から見たら次のようになります。
右手系でやったことと同じことを左手でやってみると、WikiPediaの右手系に出てる図の「左手系」と説明されている図に、親指(X)、人差し指(Y)、中指(Z)を割り当ててみて下さい。すんなり当てはまると思います。これが左手系です。
北、東の順(緯度経度の順)は、左手を使って、親指(X)が北、人差し指(Y)が東を向くようにすると、中指(Z)が鉛直上向きになっていると思います。よって、左手系です。
角度
右手系だと
右手系だと、(cos, sin)
のグラフで見慣れたものです。
左手系だと
左手系だと、
右手系と左手系とでは方位が違う
方位をプロットしたら、全く違うことになりました。逆にある点から他の点に向いた時の方位を求める(逆問題)の場合も、同じように全く異なることになります。
右回りか左回りかの判定
右回りか左回りかの判定には、z=0固定として、クロス積の合計を取ります。数式だとこんな感じです。
ここで、左下、右下、右上、左上の順にめぐり、左下に戻るリングを考えます。左回りです。
下図のようになります。
右手系の場合
右手系の座標軸を書き入れてみます。
POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))
となります。クロス積の合計を計算すると、0+100+100+0=200
と、正となります。
左手系の場合
左手系の座標軸を書き入れてみます。
POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))
となります。クロス積の合計を計算すると、0-100-100+0=-200
と、負となります。
右手系と左手系で正負が変わる
右回りか左回りかの判定のための計算式を右手系に適用するのと左手系に適用するのでは、正負が逆になります。
なお、この式は面積と密接にかかわっていて、
で面積を取れます。この場合はabs()
を取っているので、正負が逆でも影響がありません。
おわりに
右手系と左手系では左右に関する計算の結果が逆になることを示しました。
左右が密接にかかわる数式を使用する局面に限って、右手系か左手系かを気にする必要があります。もちろん、左右が関係ない(上に出した面積を求める式とか)場合には、右手系か左手系かは気にする必要はありません。
ただ、関数を記述する際に、まず、その関数の機能から左右を気にする必要があるかどうかを検討し、左右を気にする必要がある場合には、内部で使用されている座標系が右手系か左手系かで場合分けをするように実装する、という二段階にアタマを働かす必要があります。しかも関数ごとにこれをしないといけない。
シンプルでないコードはバグが湧きやすいので、これは私としては避けたい。
さらに言うと、右手系は一般的な算数の教科書が採用しているので、右手系を基にした式の方が実装しやすい、という個人的な経歴があります(また、左手系に慣れている方が左手系を採用したくなるのは当然でしょう)。
本記事のライセンス
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンス の下に提供されています。
Discussion