loxodroma.py
changeset 0 bb616224c02a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loxodroma.py	Mon May 18 08:48:51 2020 +0200
@@ -0,0 +1,66 @@
+#!/usr/bin/python3
+# coding=utf8
+
+import sys, math
+from kml import *
+
+fn = "loxodroma"
+
+long = 0				# výchozí geodetická délka - stupně
+longStep = 5
+maxSteps = 9999
+lat = 87				# výchozí geodetická šířka - stupně
+minPoleDiff = 1			# minimální vzdálenost od pólu - stupně
+R = 6378 * 1000			# zemský poloměr v metrech
+azim = 105
+tilt = 60
+range = 4800 * 1000		# metry
+speed = 1000 * 1000		# m/s		rychlost přesunu pohledu
+durMin = 0.1			# secs		minimální doba kroku
+durMax = 1				# secs		maximální doba kroku
+
+def loxClong():
+	azimR = math.radians(azim)
+	latR = math.radians(lat)
+	longStepR = math.radians(longStep)
+	latNR = math.asin(math.tanh(longStepR / math.tan(azimR) + math.atanh(math.sin(latR))))
+	latN = math.degrees(latNR)
+	longN = canonGeodetic(long + longStep)
+	move = R * math.fabs(latNR - latR) / math.cos(azimR)	# délka posunu na povrchu koule v metrech
+	dur = math.fabs(move) / speed		# doba přeletu
+	if(dur < durMin): dur = durMin
+	elif(dur > durMax): dur = durMax
+	return (longN, latN, dur, move)
+
+def list():
+	global long, lat
+	k = 0
+	while((90 - math.fabs(lat)) >= minPoleDiff and k < maxSteps):
+		(longN, latN, dur, move) = loxClong()
+		print('{}\t{}\t{}\t{}'.format(k,longN,latN, move))
+		long = longN
+		lat = latN
+		k = k + 1
+
+def run():
+	global long, lat
+	k = 0
+
+	FlyTo.head(5, False)
+	LookAt.run(long, lat, 0, azim, tilt, range)
+	FlyTo.tail()
+
+	while((90 - math.fabs(lat)) >= minPoleDiff and k < maxSteps):
+		(longN, latN, dur, move) = loxClong()
+		FlyTo.head(dur, True)
+		comm('k={}, long={}, lat={}, longN={}, latN={}, move={}'.format(str(k), str(long), str(lat), str(longN), str(latN), str(move)))
+		k = k + 1
+		LookAt.run(longN, latN, 0, azim, tilt, range)
+		FlyTo.tail()
+		long = longN
+		lat = latN
+
+# list()
+tourProlog(fn)
+run()
+tourEpilog()