Работа над инструментом, позволяющим энтузиастам моделирования полетов давать рекомендации по взлетно-посадочным полосам на основе реальных ветров в заданном аэропорту. Конечная цель состоит в том, чтобы сравнить и вернуть список доступных взлетно-посадочных полос в списке с наименьшим отклонением ветра, отображаемым в верхней части списка.
Я бы сказал, что у меня, вероятно, есть 95% того, что мне нужно, но где становится скользко, так это для направлений ветра, приближающихся к 0 градусам (360 по компасу).
Если курс взлетно-посадочной полосы 029, а направление ветра 360, разница составляет всего 29 градусов, но формула, которую я написал, показывает разницу в 331 градус.
Я пробовал экспериментировать с abs() как часть сравнения, но ничего не добился. Я свяжу свои текущие результаты здесь: https://extendsclass.com/php-bin/7eba5c8
Попытка переключения сравнений для направления ветра и направления взлетно-посадочной полосы (вычитание одного из другого, а затем наоборот) с тем же результатом.
Я уверен, что ключ кроется в какой-то маленькой ерунде из трех строк, с которой я никак не могу разобраться (я думаю, недостаток быть кодером-ковбоем-самоучкой).
Я видел пост о том, как это сделать на C#, написанный примерно 11 лет назад, но я никогда не занимался этим глубоким, темным уголком мира программирования.
Код приведен ниже:
<?php
echo "<pre>\n";
//Dummy Runways. Will be replaced by data from AVWX
$rwy_hdgs = array(
"04R" => "029",
"04L" => "029",
"22R" => "209",
"22L" => "209",
"03R" => "029",
"03L" => "029",
"21L" => "216",
"21R" => "216",
"09L" => "089",
"09R" => "089",
"27R" => "269",
"27L" => "269"
);
//Dummy Wind Heading. Will be replaced by data from AVWX
$wind_dir = "360";
$runways = array();
$i = 1;
foreach($rwy_hdgs as $key => $value)
{
$diff = $value - $wind_dir;
$runways[$i]["rwy"] = $key;
$runways[$i]["hdg"] = $value;
$runways[$i]["diff"] = abs($diff);
$i++;
}
//Select "diff" value
$diff = array_column($runways, "diff");
//Sort $runways by difference betweeen wind and runways, with smallest value first
array_multisort($diff, SORT_ASC, $runways);
foreach ($runways as $runway){
echo "Wind Heading: " . $wind_dir . "\n";
echo "Runway: " . $runway["rwy"] . "\n";
echo "Heading: " . $runway["hdg"] . "\n";
echo "Variance: " . $runway["diff"] . "°\n\n";
}
echo "</pre>\n";
?>
Итак, то, что я пытаюсь сделать, имеет хоть какой-то смысл, верно? Я надеялся, что сделал достаточно приличную работу, чтобы объяснить это…






Когда вы вычитаете два угла в круге, вы можете пойти либо «коротким путем», либо «длинным путем» - это круг... Таким образом, вы должны вычислить оба пути, а затем узнать, какой из них короче - и направление тоже, потому что у вас есть фиксированный начальный угол и фиксированный целевой угол:
function angleDiff($angleStart, $angleTarget) {
$delta = $angleTarget - $angleStart;
$direction = ($delta > 0) ? -1 : 1;
$absDelta1 = abs($delta);
$absDelta2 = 360 - $absDelta1;
return $direction * ($absDelta1 < $absDelta2 ? $absDelta1 : $absDelta2);
}
Это должно дать вам положительные числа для поворота по часовой стрелке и отрицательные числа для поворота против часовой стрелки от начального до целевого угла. Отказ от ответственности: на самом деле не тестировал код, извините, могут быть недостатки;)
Проверено... И это чертовски работает. Как я уже сказал в своем первоначальном посте, я знал, что это что-то маленькое, что мне просто нужно было настроить, чтобы правильно рассчитать. Огромное спасибо!
Когда я понял правильно, вы хотите вычислить разницу между двумя углами, всегда идущими по короткому пути. Таким образом, вы можете сделать это следующим образом:
$diff = min([abs($a - $b), 360 - abs($a - $b)]);
где $a и $b - два угла. Результат всегда будет между 0 и 180 градусами.
Попробую и этот, в дополнение к кибермозгу ранее. Спасибо!
На самом деле мне пришлось взять лист бумаги и начать рисовать — хотя написание кода — это то, чем я зарабатываю на жизнь — иногда нужно просто сделать шаг назад к основам, чтобы хотя бы полностью понять проблему ;-)