function [dist,azi,maxbreit,norvec] = grosskreis(long1,lat1,long2,lat2)
%[dist,azi,maxbreit,norvec] = grosskreis(long1,lati1,long2,lati2)
% Berechnung von Distanz, Startazimut, maximaler Breite und Normalenvektor
% zur Grosskreis-Flugroute zwischen zwei Orten auf der Welt, deren
% Laengenposition (Ost=+, West= -) und Breitenposition (N=+) bekannt ist.
dgr = pi/180;
v1=[cos(lat1*dgr)*cos(long1*dgr) cos(lat1*dgr)*sin(long1*dgr) ...
     sin(lat1*dgr)]';
v1n=[-sin(lat1*dgr)*cos(long1*dgr) -sin(lat1*dgr)*sin(long1*dgr) ...
     cos(lat1*dgr)]';
v2=[cos(lat2*dgr)*cos(long2*dgr) cos(lat2*dgr)*sin(long2*dgr) ...
      sin(lat2*dgr)]';
dist=abs(acos(v1'*v2))*6366.2;  % Winkel in rad = acos(Skalarprodukt)
if dist > 0   % Ausschliessen identische Punkte
  norvec = cross(v1,v2);
  if norm(norvec) > 0;   % Ausschliessen Antipoden
     norvec = norvec/norm(norvec);
     maxbreit =  acos(norvec(3)/norm(norvec))/dgr;
     takoff = cross(norvec,v1);
     norcomp =  (takoff'*v1n/norm(v1n))*v1n;
     westcomp = takoff-norcomp;
     azi = acos(takoff'*v1n/norm(takoff)/norm(v1n))/dgr;
     if long2 > long1 ;
        azi = -azi;
     else
        maxbreit = 180-maxbreit;
     end;
   else; disp('Antipoden!'); end;
else;  disp('identische Punkte!');  end
