loxodroma.py
author hh
Mon, 18 May 2020 08:48:51 +0200
changeset 0 bb616224c02a
permissions -rwxr-xr-x
--

#!/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()