<?php
# ******************************************************************************
# *** QRB-Calculation DC7CCC ***
# *** ***
# *** email:
dc7ccc@darc.de ***
# *** www :
www.AdventureRadio.de ***
# *** ***
# *** Die Berechnung erfolgt(e) nach Folke Rosvall, SM5AGM. ***
# *** Das Programm war in BASIC geschrieben fuer den ***
# *** COMMODORE PET 2001-32 Personal Computer. ***
# *** ***
# *** 24-Mar-1991 Basic umgesetzt in Turbo Pascal ***
# *** 07-Nov-1993 QRBberechnung nach DL5FBD eingebaut (Turbo Pascal) ***
# *** 01-Oct-1995 umgesetzt in Object-Pascal fuer Borland DELPHI 1.0 ***
# *** 07-Apr-1998 umgesetzt in JAVA-Script ***
# *** 15-Mar-1999 umgesetzt in die JAVA Klasse QwjLocator ***
# *** 11-Sep-2002 umgesetzt in PHP4 ***
# *** 17-Aug-2010 verschiedene Rundungsmoeglichkeiten in function qrbQtf ***
# *** ***
# ******************************************************************************
#-------------------------------------------------------------------------------------
#
# Berechnung des Cosinus zu einem gegebenen Gradwinkel
#
#-------------------------------------------------------------------------------------
function gCos($winkel) {
return cos($winkel * pi() / 180.0);
}
#-------------------------------------------------------------------------------------
#
# Berechnung des Gradwinkels zum gegebenen Cosinuswer
#
#-------------------------------------------------------------------------------------
function arcgCos($cosinus) {
$arcBog = 0; // Hilfsvariable vor Gradumrechnung
$result = 0; // return-Wert
if ($cosinus >= 1.0) {
$result = 0.0;
} // Sonderfall 0 Grad
else
if ($cosinus <= -1.0) {
$result = 180.0;
} // Sonderfall 180 Grad
else {
// ARCBOG:=PI/2-ARCTAN(COSINUS/(SQRT(1-SQR(COSINUS))));
$arcBog = pi() / 2.0 - atan($cosinus / (sqrt(1 - ($cosinus * $cosinus))));
// Umrechnung vom Bogenmass in Grad
$result = $arcBog * 180.0 / pi();
};
return $result;
}
#-------------------------------------------------------------------------------------
#
# Berechnung des Sinus zu einem gegebenen Gradwinkel
#
#-------------------------------------------------------------------------------------
function gSin($winkel) {
$gsin=sin($winkel*pi()/180);
return $gsin;
}
#-------------------------------------------------------------------------------------
#
# Die Funktion "QrbQtf" berechnet die Entfernung (QRB) zwischen zwei geografischen
# Koordinaten und den Winkel (Antennenrichtung, QTF)
#
#-------------------------------------------------------------------------------------
function QrbQtf($o1, $n1, $o2, $n2) {
global $yqrb;
global $yqtf;
global $yqrbround;
$yqrb = 0;
$yqtf = 0;
if (($o1 == $o2) && ($n1 == $n2)) return;
$ew = 0; // Entfernungswinkel
$rv = 0; // vorlaeufige Richtung
// Entfernungsberechnung
$ew = arcgCos(gSin($n1) * gSin($n2) + gCos($n1) * gCos($n2) * gCos($o2 - $o1));
$yqrb = 40009.0 / 360.0 * $ew;
// Richtungsberechnung
$rv = arcgCos((gSin($n2) - gSin($n1) * gCos($ew)) / (gCos($n1) * gSin($ew)));
$oo = gSin($o2 * -1 - $o1 * -1);
if ($oo >= 0)
$yqtf = $rv;
else
$yqtf = 360.0 - $rv;
switch ($yqrbround):
case 1 : $yqrb = round($yqrb,1); break;
case 2 : $yqrb = round($yqrb,2); break;
default : $yqrb = round($yqrb);
endswitch;
$yqtf = round($yqtf);
return;
}
#-------------------------------------------------------------------------------------
#
# Die Funktion "toDeg" rechnet einen QTH-Locator in geografische Koordinaten um
#
#-------------------------------------------------------------------------------------
function toDeg($yqth, $yeast, $ynorth) {
global $yeast;
global $ynorth;
$ywi = array (0,0,0,0,0,0);
$ychr = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');
$yeast = 0.0;
$ynorth = 0.0;
$yqth=strtoupper($yqth);
# Ermittlung der Indexziffern aus dem QTH-Kenner
$yc = 0;
while ($yc < 6) {
$yco = substr($yqth,$yc,1);
$yy=0;
foreach ($ychr as $letter)
{
$yy++;
if ($letter==$yco) {
$ywi[$yc]=$yy;
if ($ywi[$yc]>26) $ywi[$yc] = $yy-26;
$ywi[$yc] = $ywi[$yc] -1 ;
}
}
$yc++;
}
# Berechnung der geografischen Koordinate aus den Indexziffern
$yeast = (-180 + ($ywi[0]*20) + ($ywi[2]*2) + ($ywi[4]/12.0) + (1/24.0)) * -1;
$ynorth= -90 + ($ywi[1]*10) + ($ywi[3]*1) + ($ywi[5]/24.0) + (1/48.0);
return;
}
#-------------------------------------------------------------------------------------
#
# Die Funktion "QRB" erhaelt zwei Maidenhead-Locator und initialisiert die globalen
# Variablen "$yqrb" und "$yqtf".
#
#-------------------------------------------------------------------------------------
function qrb ($locfrom, $locto, $errcode) {
global $yeast;
global $ynorth;
global $yqrb;
global $yqtf;
$errcode=0;
$yc="";
$yc=checkLoc($locfrom);
if ($yc>"") {
$yqrb=0;
$yqtf=0;
return $yc;
}
$yc="";
$yc=checkLoc($locto);
if ($yc>"") {
$yqrb=0;
$yqtf=0;
return $yc;
}
if ($locfrom == $locto) {
$yqrb=0;
$yqtf=0;
return $errcode;
}
toDeg($locfrom, $yeast, $ynorth);
$yeast1 = $yeast;
$ynorth1 = $ynorth;
toDeg($locto, $yeast, $ynorth);
QrbQtf($yeast1, $ynorth1, $yeast, $ynorth);
}
#-------------------------------------------------------------------------------------
#
# QTH-Locator auf Gueltigkeit pruefen
#
#-------------------------------------------------------------------------------------
function checkLoc($yploc) {
$ych1 = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S');
$ych2 = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X');
$ynum = array ('0','1','2','3','4','5','6','7','8','9');
$yrtn = "";
$yploc=strtoupper($yploc);
if (strlen($yploc)<>6) {
return "error: wrong locator length";
}
if (! in_array (substr($yploc,0,1), $ych1)) {return "error in locator (char 1 out of bounds)"; }
if (! in_array (substr($yploc,1,1), $ych1)) {return "error in locator (char 2 out of bounds)"; }
if (! in_array (substr($yploc,2,1), $ynum)) {return "error in locator (num 1 out of bounds)"; }
if (! in_array (substr($yploc,3,1), $ynum)) {return "error in locator (num 2 out of bounds)"; }
if (! in_array (substr($yploc,4,1), $ych2)) {return "error in locator (char 5 out of bounds)"; }
if (! in_array (substr($yploc,5,1), $ych2)) {return "error in locator (char 6 out of bounds)"; }
return $yrtn;
}