Auf der duchsichtig dargestellten Erdkugel werden die Flugrouten gezeigt, welche von Frankfurt aus entlang von Grosskreisen zu verschiedenen Zielen führen. Man beachte die Tatsache, dass für Verbindungen auf der Nordhalbkugel die Grosskreise sehr weit nach Norden Richtung Pol ausholen.
function voidbk = airportfilms(varargin)
% uses: grosskreisfct, breitkreisfct, grosskreis, flugfct
% plot3ers
figure(1); clf
voidbk = 0;
rad = 8; flypaus = 0.04; townpaus = 1.5; townnxpaus = 0.4;
% showflug.m Beipiel-Plots f\"ur Flugrouten
hdtx = text(-9.3,8.5,'From Airport Frankfurt to', ...
'FontUnits','points','FontSize',20 , ...
'Fontweight','demi');
axis([-10 10 -10 10]); axis square;
hold on
axis off
wipl = 8*pi/180; tepl = -18*pi/180;
% meridiannetz.m Zeichnen eines Meridian-Netzes
for klg = 1:4
long = (klg-1)*30;
pl = rad*grosskreisfct(long, 360);
if long == 0
% Muster hdkr1 = plot3ers(x,y,zc1, 0,tet,0,0,'g',2) ; hold on;
hdzm = plot3ers(pl(1,:),pl(2,:),pl(3,:), wipl,tepl, 0,-1,'k',2) ;
else
hdgke(klg-1) = plot3ers(pl(1,:),pl(2,:),pl(3,:), wipl,tepl, 0,-1,'b',1) ;
hdgkw(klg-1) = plot3ers(-pl(1,:),pl(2,:),pl(3,:), wipl,tepl, 0,-1,'b',1) ;
end
end
for klat = -4:4
lat = klat*15;
pb = rad*breitkreisfct(lat);
if lat == 0
hdbr(klat+5) = plot3ers(pb(1,:),pb(2,:),pb(3,:), wipl,tepl, 0,-1,'k',2) ;
else
hdbr(klat+5) = plot3ers(pb(1,:),pb(2,:),pb(3,:), wipl,tepl, 0,-1,'b',1) ;
end
end
%Start = Frankfurt
longs = 8.6833; lats = 50.1167;
cities{1} = 'Neapel'; cities{2} = 'Athen';
cities{3} = 'Bejing'; cities{4} = 'Madrid';
cities{5} = 'Chicago'; cities{6} = 'Mumbay';
cities{7} = 'Kapstadt'; cities{8} = 'Mexico';
cities{9} = 'Moskau'; cities{10}= 'Miami';
cities{11} = 'Rio'; cities{12} = 'Sydney';
cities{13} = 'Tokyo'; cities{14} = 'Frisco';
% Neapel, Athen, Bejing, Madrid, Chicago Bombay, Kapstadt,
% London
% Mexico, Moskau, NYC , Rio, Sydney , Tokyo, Frisco,
lat = [40.833 37.9667 39.9167 40.433 41.7833 19.0 -35.9167 ...
19.4332 55.75 26.76 -22.95 -34.0 35.6667 37.6167 ];
long = [14.25 23.7167 116.25 -3.7 -95.35 72.8 18.3667 ...
-99.1167 37.6 -80.66 -43.2 151.0 139.75 -122.3833 ];
%
for k = 1:length(long)
if k > 1
delete(hdcity);
end
% Stadt anzeigen
hdcity = text(-9.6, -9.6,char(cities{k}), ...
'FontUnits','points','FontSize',20 , ...
'Fontweight','demi');
[dist,azi,maxbreit,norvec] = grosskreis(longs,lats,long(k),lat(k));
pl = rad*flugfct(longs,lats,azi,dist/6336.2*180/pi);
ll = length(pl);
for dkl = 1:20
dpart = 5*dkl;
if dkl > 1
delete(hdflac);
end
hdflac = plot3ers(pl(1,1:dpart), pl(2,1:dpart), ...
pl(3,1:dpart), wipl,tepl, 0,-1,'r',2) ;
pause(flypaus)
end
hdflg(k) = hdflac;
pause(townpaus);
end
pause(townnxpaus)
%
% grosskreisfct.m Funktion zum Erzeugen der Koordinatentripel
% eines Laengenmeridian-Sektors zur L\"ange long
% und der Winkeldistanz dist ab dem Nordpol
function coordmat = grosskreisfct(long,dist)
t = linspace(0,dist*pi/180);
coordmat = [sin(t)*cos(long*pi/180); sin(t)*sin(long*pi/180); cos(t)];
end
%
% breitkreisfct.m Funktion zum Erzeugen der Koordinatentripel
% eines Breitnmeridians der Breite lati
function coordmat = bpeitkreisfct(lati)
t = linspace(0,2*pi);
coordmat=[cos(t)*cos(lati*pi/180); sin(t)*cos(lati*pi/180);...
sin(lati*pi/180)*ones(1,length(t)) ];
end
%
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
end
%
% plk=flugfct(long,lat,azi,dist) Flugroute ab Startort long lat
% mit Abflug-Azimuth azi und Flugdistanz dist
function plk=flugfct(long,lat,azi,dist)
pm = grosskreisfct(180+azi, dist);
wy = (-90+lat)*pi/180;
Rym = [ cos(wy) 0 -sin(wy); 0 1 0; sin(wy) 0 cos(wy)];
wz = long*pi/180;
Rzm = [ cos(wz) -sin(wz) 0 ; sin(wz) cos(wz) 0 ; 0 0 1];
plk = Rzm*Rym*pm;
end
%
function plhdb = plot3ers(x,y,z,w,t,xof,yof,col,thik)
% function plhdb = plot3ers(x,y,z,w,t,xof,yof,col,thik)
% Ersatz fuer plot3
% mit Zusatz-Parametern w , t horizontaler und vertikaler Drehwinkel
% xof, yof x- und y- Offset (Zusatz) nach Projektion in 2D
% col Farbe und thik Liniendicke
% Rueckgabe plhdb plot-handle des 2D plot-Aufrufs
zrm = [cos(w) -sin(w) 0; sin(w) cos(w) 0 ; 0 0 1];
yrm = [ cos(t) 0 -sin(t) ; 0 1 0; sin(t) 0 cos(t) ];
trko = yrm*zrm*[x;y;z];
plhdb = plot(trko(2,:)+xof, trko(3,:)+yof,col,'LineWidth',thik);
end
end