Re: Nasalを知ろう、使おう!
Tat
投稿数: 375
色々解説しておきながらなんですが、AirRacing のバグを2つ程見つけてしまいました。
バグ修正済みの最新版は AirRacing-20080704.tar.gz です。是非お試しください。なお、今回は開発版の変更も取り入れましたので、ゲート番号が表示されるようになり、矢印の形がロケットになっています(どの方向からでも見やすいのはこんな形ですかね?)
さて、せっかくの Nasal スレッドですので、何が間違えていたかを説明しておきます。まずは、ゲート中心から機体中心への距離を求める式が間違っていました。
正しい計算方法は
引用:
なのですが、2つも大きな間違いがありました。間違ったコードを見てみましょう。
引用:
両方とも2行目が問題です。1つ目は、ある緯度における経度差の距離計算に対しては緯度のコサインを掛けるのですが、この計算を cos(me.lat) ではなく cos(me.lon) としていました。全くの凡ミスです。更に、cos の引数をラジアンに変換するのを忘れていました。もう笑うしかありません。これらの間違いにより、最大で誤差100% (経度1°当り111.12 km) になります(笑) しかしながら、距離が短い事とラジアン変換ミスの誤差とある程度相殺されるので、大抵の場合 ±20〜30m の誤差になるようです。このため精度は悪いけど、とりあえず通過判定ができていたということになります。
こういう場合はバグの発見が遅れてしまいがちです。今回は Racer.dist_m をモニタしながらゲートの端を通過した時に, dist_m が 80 m だったり109 m だったりとばらつきがあったため、計算が間違っている事に気づきました。
いずれにしても、sambar さんのご指摘が無ければ、このバグは ずっと見過ごしている所でした。大変ありがとうございました。
つぎに、2つ目の問題を説明します、通過判定のところで本来なら
引用:の際に通過と見なすべきですが、以前のコードには間違いがあり、最小の距離になる前に通過判定をしてしまう場合があることと、接触判定を見越してゲート幅にバンク時の機体幅を足す計算がありませんでした。
ついでに、sambar さんご提案の JSBSim の WingSpan を取り込むようにしてみました。これらの修正 & 変更で随分精度はよくなったのではないかと思います。
ちなみに Wing Span を参照する部分が多くなって来たので、TouchingPenalty.WING_SPAN を
Racer.wingSpan に変更しました。また、水平方向での機体幅は Racer.currentWidth() で取得できるようになっています。
今回の修正に関して具体的に何が変更されたかを知りたい場合は、直前の開発版である AirRacing-dev-20080516 との diff を取ってください。変更されているのは racing.nas です。
バグ修正済みの最新版は AirRacing-20080704.tar.gz です。是非お試しください。なお、今回は開発版の変更も取り入れましたので、ゲート番号が表示されるようになり、矢印の形がロケットになっています(どの方向からでも見やすいのはこんな形ですかね?)
さて、せっかくの Nasal スレッドですので、何が間違えていたかを説明しておきます。まずは、ゲート中心から機体中心への距離を求める式が間違っていました。
正しい計算方法は
引用:
var dlat_m = dlat * 111120;
var dlon_m = dlon * math.cos(me.lat / 180 * math.pi) * 111120;
me.dist_m = math.sqrt(dlat_m * dlat_m + dlon_m * dlon_m);
# dlat : 機体中心とゲート中心との緯度の差分 (deg)
# dlon : 機体中心とゲート中心の経度の差分 (deg)
# dlat_m : dlat の距離 (m)
# dlon_m : dlon の距離 (m)
# me.dist_m: 機体中心とゲート中心との距離 (m)
# me.lat: 機体中心の緯度
なのですが、2つも大きな間違いがありました。間違ったコードを見てみましょう。
引用:
var dlat_m = dlat * 111120;
var dlon_m = dlon * math.cos(me.lon) * 111120;
me.dist_m = math.sqrt(dlat_m * dlat_m + dlon_m * dlon_m);
両方とも2行目が問題です。1つ目は、ある緯度における経度差の距離計算に対しては緯度のコサインを掛けるのですが、この計算を cos(me.lat) ではなく cos(me.lon) としていました。全くの凡ミスです。更に、cos の引数をラジアンに変換するのを忘れていました。もう笑うしかありません。これらの間違いにより、最大で誤差100% (経度1°当り111.12 km) になります(笑) しかしながら、距離が短い事とラジアン変換ミスの誤差とある程度相殺されるので、大抵の場合 ±20〜30m の誤差になるようです。このため精度は悪いけど、とりあえず通過判定ができていたということになります。
こういう場合はバグの発見が遅れてしまいがちです。今回は Racer.dist_m をモニタしながらゲートの端を通過した時に, dist_m が 80 m だったり109 m だったりとばらつきがあったため、計算が間違っている事に気づきました。
いずれにしても、sambar さんのご指摘が無ければ、このバグは ずっと見過ごしている所でした。大変ありがとうございました。
つぎに、2つ目の問題を説明します、通過判定のところで本来なら
引用:
最小距離 (Gate.minDistance) < 機体とゲートとの間の距離 (Racer.dist_m)
かつ
最小距離 < (ゲートの幅 + バンク時の機体幅) / 2
ついでに、sambar さんご提案の JSBSim の WingSpan を取り込むようにしてみました。これらの修正 & 変更で随分精度はよくなったのではないかと思います。
ちなみに Wing Span を参照する部分が多くなって来たので、TouchingPenalty.WING_SPAN を
Racer.wingSpan に変更しました。また、水平方向での機体幅は Racer.currentWidth() で取得できるようになっています。
今回の修正に関して具体的に何が変更されたかを知りたい場合は、直前の開発版である AirRacing-dev-20080516 との diff を取ってください。変更されているのは racing.nas です。
投票数:20
平均点:5.50
投稿ツリー
-
Nasalを知ろう、使おう!
(Tat, 2008-4-11 0:54)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-22 20:54)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-4-22 22:38)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-23 10:12)
- Re: Nasalを知ろう、使おう! (hide, 2008-4-23 12:55)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-24 18:55)
-
Re: Nasalを知ろう、使おう!
(toshi, 2008-4-25 3:04)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-25 4:02)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-26 8:07)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-29 17:04)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-30 1:02)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-30 20:44)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-30 23:11)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-5-1 23:25)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-5-2 0:13)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-5-5 14:36)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-5-7 15:23)
- Re: Nasalを知ろう、使おう! (Tat, 2008-5-8 1:19)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-5-7 15:23)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-5-5 14:36)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-5-2 0:13)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-5-1 23:25)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-30 23:11)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-30 20:44)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-30 1:02)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-29 17:04)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-26 8:07)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-25 4:02)
-
Re: Nasalを知ろう、使おう!
(toshi, 2008-4-25 3:04)
-
Re: Nasalを知ろう、使おう!
(hide, 2008-4-23 10:12)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-4-22 22:38)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-7-1 22:25)
- Re: Nasalを知ろう、使おう! (toshi, 2008-7-2 23:50)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-7-3 22:46)
- Re: Nasalを知ろう、使おう! (toshi, 2008-7-4 1:54)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-7-4 1:52)
- Re: Nasalを知ろう、使おう! (Tat, 2008-7-4 15:16)
- Re: Nasalを知ろう、使おう! (sambar, 2008-7-5 1:19)
- 揺れる空母の着艦に挑戦 :-) (Tat, 2008-7-30 10:03)
- Nasal の落とし穴 (Tat, 2008-8-9 16:13)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-11-9 2:34)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-11-9 14:41)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-11-9 22:50)
- Re: Nasalを知ろう、使おう! (Tat, 2008-11-9 23:59)
-
Re: Nasalを知ろう、使おう!
(sambar, 2008-11-9 22:50)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-11-9 14:41)
- Re: Nasalを知ろう、使おう! (sambar, 2008-11-10 19:58)
- Re: ジョイスティック設定とNasal (sambar, 2009-7-11 1:25)
-
Re: Nasalを知ろう、使おう!
(inomaty, 2015-11-16 2:06)
- Re: Nasalを知ろう、使おう! (inomaty, 2015-11-18 22:42)
-
Re: Nasalを知ろう、使おう!
(Tat, 2008-4-22 20:54)