スタートライン通過判定
腕時計 限定モデル コラボ LAPS ナムコミュージアム メンズ レディース 時計 男女兼用 レトロゲームグッズ 昭和レトロ おしゃれ ホッピングマッピー コバルト ブルー ナイロンベルト プレゼント 誕生日プレゼント 贈り物価格:9,900円(税込、送料別) (2023/5/12時点)楽天で購入GPSタイム計測アプリ(Laps 4.12)をリリースしたんだけど、少しタイム計算のコア部分をさわりました。これまでより、全体のタイムがほんの少し大きく、距離がほんの少し長くなります。具体的には、これまでスタートライン通過後の初点を使っていたのを、スタートライン通過の前後点とスタートラインとの交点との距離比でタイムと距離を計算するようにしました。ArchiveProとArchive+も同様の変更は完了していますが、テスト検証がちょっと複雑で、フィールドテストでの検証後のリリースになります。ちなみに、スタートライン通過判定は、スタートラインの始点と終点を結ぶ直線と、走行軌跡の出発点と到着点を結ぶ直線が交差するかで判定しています。高校数学ですね。Javaコードでかくとこんな感じ。// 交差判定 //// ds:計測ライン開始位置 de:計測ライン終了位置 as:出発地点 ae:到着地点public static boolean intersectCheck (double[] ds, double[] de, double[] as, double[] ae) { if (as[0] == 0 && as[1] == 0) // 出発地点がZEROの場合は交差判定しない return false; else if (((ds[0] - de[0]) * (as[1] - ds[1]) + (ds[1] - de[1]) * (ds[0] - as[0])) * ((ds[0] - de[0]) * (ae[1] - ds[1]) + (ds[1] - de[1]) * (ds[0] - ae[0])) < 0) return ((as[0] - ae[0]) * (ds[1] - as[1]) + (as[1] - ae[1]) * (as[0] - ds[0])) * ((as[0] - ae[0]) * (de[1] - as[1]) + (as[1] - ae[1]) * (as[0] - de[0])) < 0; else return false;}交差判定で真の場合は交点を計算します。あとは、出発点と到着点と交点を結ぶ線の長さをそれぞれ求めます。// 交点算出 //// ds:計測ライン開始位置 de:計測ライン終了位置 as:出発地点 ae:到着地点public static double[] intersection(double[] ds, double[] de, double[] as, double[] ae) { double[] results = new double[] {0,0}; double d = (de[1] - ds[1]) * (ae[0] - as[0]) - (de[0] - ds[0]) * (ae[1] - as[1]); if (d != 0) { results[1] = ds[1] + ((as[1] - ds[1]) * (ae[0] - as[0]) - (as[0] - ds[0]) * (ae[1] - as[1])) / d * (de[1] - ds[1]); results[0] = ds[0] + ((as[1] - ds[1]) * (ae[0] - as[0]) - (as[0] - ds[0]) * (ae[1] - as[1])) / d * (de[0] - ds[0]); } return results;}補足しますと、スタートラインは計測を開始する計測ラインのことです。区間計測する計測ラインや、計測を終了する計測ラインのゴールラインは、計測ライン通過の前後点と計測ラインとの交点との距離比でタイムと距離を計算していましたので、今回の修正は、スタートラインのみの話です。ですので、0.1秒未満の誤差の部分がより正確になったという話です。ポチッとして頂けると、次のコンテンツを作成する励みになります♪