Files
Masterprojekt/nicht abgeben/GHA_biaxial/gauss.py
2026-02-11 12:08:46 +01:00

102 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from typing import Tuple
from ellipsoid_biaxial import EllipsoidBiaxial
from numpy import arctan, cos, sin, sqrt, tan
def gha1(re: EllipsoidBiaxial, phi0: float, lamb0: float, alpha0: float, s: float, eps: float = 1e-12) -> Tuple[float, float, float]:
"""
Berechnung der 1. Geodätische Hauptaufgabe nach Gauß´schen Mittelbreitenformeln
:param re: Klasse Ellipsoid
:param phi0: Breite Punkt 0
:param lamb0: Länge Punkt 0
:param alpha0: Azimut der geodätischen Linie in Punkt 1
:param s: Strecke zu Punkt 1
:param eps: Abbruchkriterium für Winkelgrößen
:return: Breite, Länge, Azimut von Punkt 21
"""
t = lambda phi: tan(phi)
eta = lambda phi: sqrt(re.e_ ** 2 * cos(phi) ** 2)
F1 = lambda alpha, phi, s: 1 + (2 + 3 * t(phi) ** 2 + 2 * eta(phi) ** 2) / (24 * re.N(phi) ** 2) * sin(alpha) ** 2 * s ** 2 \
+ (t(phi)**2 - 1) * eta(phi) ** 2 / (8 * re.N(phi) ** 2) * cos(alpha) ** 2 * s ** 2
F2 = lambda alpha, phi, s: 1 + t(phi) ** 2 / (24 * re.N(phi) ** 2) * sin(alpha) ** 2 * s ** 2 \
- (1 + eta(phi)**2 - 9 * eta(phi)**2 * t(phi)**2) / (24 * re.N(phi) ** 2) * cos(alpha) ** 2 * s ** 2
F3 = lambda alpha, phi, s: 1 + (1 + eta(phi) ** 2) / (12 * re.N(phi) ** 2) * sin(alpha) ** 2 * s ** 2 \
+ (3 + 8 * eta(phi)**2) / (24 * re.N(phi) ** 2) * cos(alpha) ** 2 * s ** 2
phi1_i = lambda alpha, phi: phi0 + cos(alpha) / re.M(phi) * s * F1(alpha, phi, s)
lamb1_i = lambda alpha, phi: lamb0 + sin(alpha) / (re.N(phi) * cos(phi)) * s * F2(alpha, phi, s)
alpha1_i = lambda alpha, phi: alpha0 + sin(alpha) * tan(phi) / re.N(phi) * s * F3(alpha, phi, s)
phi_m_i = lambda phi1: (phi0 + phi1) / 2
alpha_m_i = lambda alpha1: (alpha0 + alpha1) / 2
phi_m = []
alpha_m = []
phi1 = []
lamb1 = []
alpha1 = []
# 1. Näherung für P1
phi1.append(phi0 + cos(alpha0) / re.M(phi0) * s)
lamb1.append(lamb0 + sin(alpha0) / (re.N(phi0) * cos(phi0)) * s)
alpha1.append(alpha0 + sin(alpha0) * tan(phi0) / re.N(phi0) * s)
while True:
# Berechnug P_m durch Mittelbildung
phi_m.append(phi_m_i(phi1[-1]))
alpha_m.append(alpha_m_i(alpha1[-1]))
# Berechnung P1
phi1.append(phi1_i(alpha_m[-1], phi_m[-1]))
lamb1.append(lamb1_i(alpha_m[-1], phi_m[-1]))
alpha1.append(alpha1_i(alpha_m[-1], phi_m[-1]))
# Abbruchkriterium
if abs(phi1[-2] - phi1[-1]) < eps and \
abs(lamb1[-2] - lamb1[-1]) < eps and \
abs(alpha1[-2] - alpha1[-1]) < eps:
break
return phi1[-1], lamb1[-1], alpha1[-1]
def gha2(re: EllipsoidBiaxial, phi0: float, lamb0: float, phi1: float, lamb1: float):
"""
Berechnung der 2. Geodätische Hauptaufgabe nach Gauß´schen Mittelbreitenformeln
:param re: Klasse Ellipsoid
:param phi0: Breite Punkt 1
:param lamb0: Länge Punkt 1
:param phi1: Breite Punkt 2
:param lamb1: Länge Punkt 2
:return: Länge der geodätischen Linie, Azimut von P1 nach P2, Azimut von P2 nach P1
"""
t = lambda phi: tan(phi)
eta = lambda phi: sqrt(re.e_ ** 2 * cos(phi) ** 2)
phi_0 = (phi0 + phi1) / 2
d_phi = phi1 - phi0
d_lambda = lamb1 - lamb0
f_A = lambda phi: (2 + 3*t(phi)**2 + 2*eta(phi)**2) / 24
f_B = lambda phi: ((t(phi)**2 - 1) * eta(phi)**2) / 8
# f_C = lambda phi: (t(phi)**2) / 24
f_D = lambda phi: (1 + eta(phi)**2 - 9 * eta(phi)**2 * t(phi)**2) / 24
F1 = lambda phi: d_phi * re.M(phi) * (1 - f_A(phi) * d_lambda ** 2 * cos(phi) ** 2 -
f_B(phi) * d_phi ** 2 / re.V(phi) ** 4)
F2 = lambda phi: d_lambda * re.N(phi) * cos(phi) * (1 - 1 / 24 * d_lambda ** 2 * sin(phi) ** 2 +
f_D(phi) * d_phi ** 2 / re.V(phi) ** 4)
s = sqrt(F1(phi_0) ** 2 + F2(phi_0) ** 2)
A_0 = arctan(F2(phi_0) / F1(phi_0))
d_A = d_lambda * sin(phi_0) * (1 + (1 + eta(phi_0) ** 2) / 12 * s ** 2 * sin(A_0) ** 2 / re.N(phi_0) ** 2 +
(3 + 8 * eta(phi_0) ** 2) / 24 * s ** 2 * cos(A_0) ** 2 / re.N(phi_0) ** 2)
alpha0 = A_0 - d_A / 2
alpha1 = A_0 + d_A / 2
return alpha0, alpha1, s