PHP - Как сравнить два заголовка на компасе?

Работа над инструментом, позволяющим энтузиастам моделирования полетов давать рекомендации по взлетно-посадочным полосам на основе реальных ветров в заданном аэропорту. Конечная цель состоит в том, чтобы сравнить и вернуть список доступных взлетно-посадочных полос в списке с наименьшим отклонением ветра, отображаемым в верхней части списка.

Я бы сказал, что у меня, вероятно, есть 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"] . "&#176;\n\n";
    }
    echo "</pre>\n";
?>

На самом деле мне пришлось взять лист бумаги и начать рисовать — хотя написание кода — это то, чем я зарабатываю на жизнь — иногда нужно просто сделать шаг назад к основам, чтобы хотя бы полностью понять проблему ;-)

cyberbrain 28.03.2022 20:44

Итак, то, что я пытаюсь сделать, имеет хоть какой-то смысл, верно? Я надеялся, что сделал достаточно приличную работу, чтобы объяснить это…

Redbeard 28.03.2022 22:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы вычитаете два угла в круге, вы можете пойти либо «коротким путем», либо «длинным путем» - это круг... Таким образом, вы должны вычислить оба пути, а затем узнать, какой из них короче - и направление тоже, потому что у вас есть фиксированный начальный угол и фиксированный целевой угол:

function angleDiff($angleStart, $angleTarget) {
  $delta = $angleTarget - $angleStart;
  $direction = ($delta > 0) ? -1 : 1;
  $absDelta1 = abs($delta);
  $absDelta2 = 360 - $absDelta1;
  return $direction * ($absDelta1 < $absDelta2 ? $absDelta1 : $absDelta2);
}

Это должно дать вам положительные числа для поворота по часовой стрелке и отрицательные числа для поворота против часовой стрелки от начального до целевого угла. Отказ от ответственности: на самом деле не тестировал код, извините, могут быть недостатки;)

Проверено... И это чертовски работает. Как я уже сказал в своем первоначальном посте, я знал, что это что-то маленькое, что мне просто нужно было настроить, чтобы правильно рассчитать. Огромное спасибо!

Redbeard 29.03.2022 14:12

Когда я понял правильно, вы хотите вычислить разницу между двумя углами, всегда идущими по короткому пути. Таким образом, вы можете сделать это следующим образом:

$diff = min([abs($a - $b), 360 - abs($a - $b)]);

где $a и $b - два угла. Результат всегда будет между 0 и 180 градусами.

Попробую и этот, в дополнение к кибермозгу ранее. Спасибо!

Redbeard 29.03.2022 02:17

Другие вопросы по теме