function CalculateArc($Text) { global $TempArea,$TempPoint,$CenterY, $CenterX,$Rotation ; $parts=split(",",substr($Text,3) ); if ( count($parts)==1 ) { echo "Wrong format in CalculateArc<BR>"; return; } list ($res, $StartLon , $StartLat) = ReadCoords( $parts[0] ); list ($res, $EndLon , $EndLat) = ReadCoords( $parts[1] ); list($Radius, $StartBearing) = DistanceBearing($CenterY, $CenterX, $StartLat, $StartLon, 1,1); list($tmp1 , $EndBearing) = DistanceBearing($CenterY, $CenterX, $EndLat, $EndLon,0,1); $TempPoint->Latitude = $StartLat; $TempPoint->Longitude = $StartLon; AddPoint($TempPoint); while(abs($EndBearing-$StartBearing) > 7.5) { $StartBearing += $Rotation *5 ; if($StartBearing > 360) $StartBearing -= 360; if($StartBearing < 0) $StartBearing += 360; list($TempPoint->Latitude,$TempPoint->Longitude)= FindLatitudeLongitude($CenterY, $CenterX, $StartBearing, $Radius, 1,1 ); AddPoint($TempPoint); } $TempPoint->Latitude = $EndLat; $TempPoint->Longitude = $EndLon; AddPoint($TempPoint); }
function CrossTrackError($lon1, $lat1, $lon2, $lat2, $lon3, $lat3) { $dot1 = dot($lon1, $lat1, $lon2, $lat2, $lon3, $lat3); if ($dot1 > 0) { list($dist_BD, $tmp1) = DistanceBearing($lat2, $lon2, $lat3, $lon3, 1, 0); return $dist_BD; } $dot2 = dot($lon2, $lat2, $lon1, $lat1, $lon3, $lat3); if ($dot2 > 0) { list($dist_AD, $crs_AD) = DistanceBearing($lat1, $lon1, $lat3, $lon3, 1, 1); return $dist_AD; } list($dist_AD, $crs_AD) = DistanceBearing($lat1, $lon1, $lat3, $lon3, 1, 1); $dist_AD /= RAD_TO_DEG * 111194.9267; $crs_AD *= DEG_TO_RAD; // list($dist_AB, $crs_AB)= DistanceBearing($lat1, $lon1, $lat2, $lon2, 1,1); list($tmp1, $crs_AB) = DistanceBearing($lat1, $lon1, $lat2, $lon2, 0, 1); // DEBUG("a1",1,"dist_AB : $dist_AB dist_AD:$dist_AD "); //$dist_AB_m= $dist_AB; //$dist_AB/= (RAD_TO_DEG * 111194.9267); $crs_AB *= DEG_TO_RAD; // $lat1 *= DEG_TO_RAD; // $lat2 *= DEG_TO_RAD; // $lat3 *= DEG_TO_RAD; // $lon1 *= DEG_TO_RAD; // $lon2 *= DEG_TO_RAD; // $lon3 *= DEG_TO_RAD; // double XTD; // cross track distance // double ATD; // along track distance // The "along track distance", ATD, the distance from A along the // course towards B to the point abeam D $sindist_AD = sin($dist_AD); $XTD = asin($sindist_AD * sin($crs_AD - $crs_AB)); //$sinXTD = sin($XTD); //$ATD = asin(sqrt( $sindist_AD*$sindist_AD - $sinXTD*$sinXTD )/cos($XTD)); /* if (lon4 && lat4) { IntermediatePoint(lon1, lat1, lon2, lat2, ATD, dist_AB, lon4, lat4); } */ // units $XTD *= RAD_TO_DEG * 111194.9267; //$ATD *= (RAD_TO_DEG * 111194.9267); /* //DEBUG("a1",1," XTD: $XTD , ATD: $ATD<BR>"); if ($ATD > $dist_AB_m ) { list($dist_BD, $tmp1 )= DistanceBearing($lat2, $lon2, $lat3, $lon3, 1,0); $XTD = min($dist_AD_m ,$dist_BD); DEBUG("a1",1," special case: $dist_AD_m , $dist_BD<BR>"); } else { DEBUG("a1",1,"XTD ($XTD) is ok ($ATD < $dist_AB_m )<BR>"); } */ // return abs($ATD); return abs($XTD); }