Я стараюсь оптимизировать расстояние от траектории полета планера. У меня GPS фиксирует каждые 3 секунды (широта, долгота, высота). Итак, теперь у меня есть все исправления в массиве:
//This is an example of a fix
$fixes[0]['lat'] = '4710789N';
$fixes[0]['lon'] = '00724859E';
$fixes[0]['altitude'] = '00386'; //meters
//and another fix
$fixes[1]['lat'] = '4710899N';
$fixes[1]['lon'] = '00724965E';
$fixes[1]['altitude'] = '00392'; //meters
.
.
.
.
//and the rest of ~3000 fixes
Долгота и широта исправлений фактически в формате DM. Поэтому для лучшего расчета с ними я конвертирую их с помощью этой функции в десятичный формат:
function DMStoDecimal($DMS){
$isLat = false;
if(substr($DMS, 7, 1) == "N" || substr($DMS, 7, 1) == "S"){
$isLat = true;
}
if($isLat){
$deg = substr($DMS, 0, 2);
$minutes = substr($DMS, 2, 2);
$minutes .= "." . substr($DMS, 4, 3);
$sign = "";
if(substr($DMS, 7, 1) == "N"){
$sign = "-";
}
}else{
$deg = substr($DMS, 0, 3);
$minutes = substr($DMS, 3, 2);
$minutes .= "." . substr($DMS, 5, 3);
$sign = "";
if(substr($DMS, 8, 1) == "E"){
$sign = "-";
}
}
$minutesDecimal = (float)$minutes / 60;
$result = $deg + $minutesDecimal;
return $sign . $result;
}
И с помощью этой функции я могу вычислить расстояние между двумя исправлениями:
function distance($lat1, $lon1, $lat2, $lon2, $unit) {
if (($lat1 == $lat2) && ($lon1 == $lon2)) {
return 0;
}else{
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtoupper($unit);
if ($unit == "K") {
return ($miles * 1.609344);
} else if ($unit == "N") {
return ($miles * 0.8684);
} else {
return $miles;
}
}
}
Я не могу Рассчитайте расстояние между каждым исправлением и суммируйте их, потому что есть некоторые правила, как рассчитывается расстояние для полета. Для полета я могу использовать только 6 этапов (1 начальная точка, 5 точек поворота, 1 конечная точка sh). Теперь я должен сделать оптимизацию для расчета расстояния. Мне нужно знать, какие 7 исправлений (включая исправление start и fini sh fix) для получения максимально возможного расстояния.
Я подумал, что могу начать с создания матрицы N * N, подобной этой:
/// N*N matrix half-filled with the distances in kilometers between all points.
/// - N: Number of points
/// - X: Distance to every point (calculated with function above)
///
/// +-----------------------> column
/// Fix 1 | - - - - - - - - - - -
/// Fix 2 | X - - - - - - - - - -
/// Fix 3 | X X - - - - - - - - -
/// Fix 4 | X X X - - - - - - - -
/// Fix 5 | X X X X - - - - - - -
/// Fix 6 | X X X X X - - - - - -
/// Fix 7 | X X X X X X - - - - -
/// Fix 8 | X X X X X X X - - - -
/// Fix 9 | X X X X X X X X - - -
/// Fix 10| X X X X X X X X X - -
/// Fix 11| X X X X X X X X X X -
/// v
/// row
Но теперь я не знаю, как я могу оценить необходимые исправления.
На втором шаге я также должен учесть, что конечная точка sh должна быть максимально на 1000 м ниже. чем первая (начальная) точка. Я что-то слышал о Графе, чтобы найти решение, но я не знаю, как продолжить свою работу.
Спасибо за помощь!