loxodroma.py
changeset 0 bb616224c02a
equal deleted inserted replaced
-1:000000000000 0:bb616224c02a
       
     1 #!/usr/bin/python3
       
     2 # coding=utf8
       
     3 
       
     4 import sys, math
       
     5 from kml import *
       
     6 
       
     7 fn = "loxodroma"
       
     8 
       
     9 long = 0				# výchozí geodetická délka - stupně
       
    10 longStep = 5
       
    11 maxSteps = 9999
       
    12 lat = 87				# výchozí geodetická šířka - stupně
       
    13 minPoleDiff = 1			# minimální vzdálenost od pólu - stupně
       
    14 R = 6378 * 1000			# zemský poloměr v metrech
       
    15 azim = 105
       
    16 tilt = 60
       
    17 range = 4800 * 1000		# metry
       
    18 speed = 1000 * 1000		# m/s		rychlost přesunu pohledu
       
    19 durMin = 0.1			# secs		minimální doba kroku
       
    20 durMax = 1				# secs		maximální doba kroku
       
    21 
       
    22 def loxClong():
       
    23 	azimR = math.radians(azim)
       
    24 	latR = math.radians(lat)
       
    25 	longStepR = math.radians(longStep)
       
    26 	latNR = math.asin(math.tanh(longStepR / math.tan(azimR) + math.atanh(math.sin(latR))))
       
    27 	latN = math.degrees(latNR)
       
    28 	longN = canonGeodetic(long + longStep)
       
    29 	move = R * math.fabs(latNR - latR) / math.cos(azimR)	# délka posunu na povrchu koule v metrech
       
    30 	dur = math.fabs(move) / speed		# doba přeletu
       
    31 	if(dur < durMin): dur = durMin
       
    32 	elif(dur > durMax): dur = durMax
       
    33 	return (longN, latN, dur, move)
       
    34 
       
    35 def list():
       
    36 	global long, lat
       
    37 	k = 0
       
    38 	while((90 - math.fabs(lat)) >= minPoleDiff and k < maxSteps):
       
    39 		(longN, latN, dur, move) = loxClong()
       
    40 		print('{}\t{}\t{}\t{}'.format(k,longN,latN, move))
       
    41 		long = longN
       
    42 		lat = latN
       
    43 		k = k + 1
       
    44 
       
    45 def run():
       
    46 	global long, lat
       
    47 	k = 0
       
    48 
       
    49 	FlyTo.head(5, False)
       
    50 	LookAt.run(long, lat, 0, azim, tilt, range)
       
    51 	FlyTo.tail()
       
    52 
       
    53 	while((90 - math.fabs(lat)) >= minPoleDiff and k < maxSteps):
       
    54 		(longN, latN, dur, move) = loxClong()
       
    55 		FlyTo.head(dur, True)
       
    56 		comm('k={}, long={}, lat={}, longN={}, latN={}, move={}'.format(str(k), str(long), str(lat), str(longN), str(latN), str(move)))
       
    57 		k = k + 1
       
    58 		LookAt.run(longN, latN, 0, azim, tilt, range)
       
    59 		FlyTo.tail()
       
    60 		long = longN
       
    61 		lat = latN
       
    62 
       
    63 # list()
       
    64 tourProlog(fn)
       
    65 run()
       
    66 tourEpilog()