Berechnungen Kugel

This commit is contained in:
2026-01-13 16:52:45 +01:00
parent de35fb786f
commit 39f5dbdd95

View File

@@ -1,78 +1,64 @@
import numpy as np
from numpy import sqrt, arctan2, sin, cos, arcsin, arccos
from numpy.typing import NDArray
from typing import Tuple
import winkelumrechnungen as wu
def cart2sph(x, y, z):
r = np.sqrt(x**2 + y**2 + z**2)
phi = np.atan2(z, np.sqrt(x**2 + y**2))
lamb = np.atan2(y, x)
def cart2sph(point: NDArray) -> Tuple[float, float, float]:
x, y, z = point
r = sqrt(x**2 + y**2 + z**2)
phi = arctan2(z, sqrt(x**2 + y**2))
lamb = arctan2(y, x)
return r, np.rad2deg(phi), np.rad2deg(lamb)
return r, phi, lamb
def sph2cart(r, phi, lamb):
phi_rad = np.deg2rad(phi)
lamb_rad = np.deg2rad(lamb)
def sph2cart(r: float, phi: float, lamb: float) -> NDArray:
x = r * cos(phi) * cos(lamb)
y = r * cos(phi) * sin(lamb)
z = r * sin(phi)
x = r * np.cos(phi_rad) * np.cos(lamb_rad)
y = r * np.cos(phi_rad) * np.sin(lamb_rad)
z = r * np.sin(phi_rad)
return x, y, z
return np.array([x, y, z])
def kugel_erste_gha(R, phi_1, lamb_1, s_d, a_12):
def gha1(R, phi0, lamb0, s, alpha0):
s_ = s / R
s = s_d / R
lamb_1_rad = np.deg2rad(lamb_1)
phi_1_rad = np.deg2rad(phi_1)
a_12_rad = np.deg2rad(a_12)
lamb1 = lamb0 + arctan2(sin(s_) * sin(alpha0),
cos(phi0) * cos(s_) - sin(phi0) * sin(s_) * cos(alpha0))
sin_satz = np.sin(s) * np.sin(a_12_rad)
sin_kos = np.cos(phi_1_rad) * np.cos(s) - np.sin(phi_1_rad) * np.sin(s) * np.cos(a_12_rad)
delta_lam = np.atan2(sin_satz, sin_kos)
lamb_2_rad = lamb_1_rad + delta_lam
phi1 = arcsin(sin(phi0) * cos(s_) + cos(phi0) * sin(s_) * cos(alpha0))
phi_2_rad = np.asin(np.sin(phi_1_rad) * np.cos(s) + np.cos(phi_1_rad) * np.sin(s) * np.cos(a_12_rad))
sin_satz_2 = -np.cos(phi_1_rad) * np.sin(a_12_rad)
sin_kos_2 = np.sin(s) * np.sin(phi_1_rad) - np.cos(s) * np.cos(phi_1_rad) * np.cos(a_12_rad)
a_21_rad = np.atan2(sin_satz_2, sin_kos_2)
if a_21_rad < 0:
a_21_rad += 2 * np.pi
return np.rad2deg(phi_2_rad), np.rad2deg(lamb_2_rad), np.rad2deg(a_21_rad)
return phi1, lamb1
def kugel_zweite_gha(R, phi_1, lamb_1, phi_2, lamb_2):
phi_1_rad = np.deg2rad(phi_1)
lamb_1_rad = np.deg2rad(lamb_1)
phi_2_rad = np.deg2rad(phi_2)
lamb_2_rad = np.deg2rad(lamb_2)
def gha2(R, phi0, lamb0, phi1, lamb1):
s_ = arccos(sin(phi0) * sin(phi1) + cos(phi0) * cos(phi1) * cos(lamb1 - lamb0))
s = R * s_
sin_satz_1 = np.cos(phi_2_rad) * np.sin(lamb_2_rad - lamb_1_rad)
sin_kos_1 = np.cos(phi_1_rad) * np.sin(phi_2_rad) - np.sin(phi_1_rad) * np.cos(phi_2_rad) * np.cos(lamb_2_rad - lamb_1_rad)
a_12_rad = np.atan2(sin_satz_1, sin_kos_1)
alpha0 = arctan2(cos(phi1) * sin(lamb1 - lamb0),
cos(phi0) * sin(phi1) - sin(phi0) * cos(phi1) * cos(lamb1 - lamb0))
kos = np.sin(phi_1_rad) * np.sin(phi_2_rad) + np.cos(phi_1_rad) * np.cos(phi_2_rad) * np.cos(lamb_2_rad - lamb_1_rad)
s = np.acos(kos)
s_d = R * s
alpha1 = arctan2(-cos(phi0) * sin(lamb1 - lamb0),
cos(phi1) * sin(phi0) - sin(phi1) * cos(phi0) * cos(lamb1 - lamb0))
if alpha1 < 0:
alpha1 += 2 * np.pi
sin_satz_2 = -np.cos(phi_1_rad) * np.sin(lamb_2_rad - lamb_1_rad)
sin_kos_2 = np.cos(phi_2_rad) * np.sin(phi_1_rad) - np.sin(phi_2_rad) * np.cos(phi_1_rad) * np.cos(lamb_2_rad - lamb_1_rad)
a_21_rad = np.atan2(sin_satz_2, sin_kos_2)
if a_21_rad < 0:
a_21_rad += 2 * np.pi
return s_d, np.rad2deg(a_12_rad), np.rad2deg(a_21_rad)
return alpha0, alpha1, s
if __name__ == "__main__":
R = 6378815.904 # Bern
phi_1 = 10
lamb_1 = 40
a_12 = 100
phi0 = wu.deg2rad(10)
lamb0 = wu.deg2rad(40)
alpha0 = wu.deg2rad(100)
s = 10000
phi_2, lamb_2, _ = kugel_erste_gha(R, phi_1, lamb_1, s, a_12)
phi1, lamb1 = gha1(R, phi0, lamb0, s, alpha0)
alpha0_g, alpha1, s_g = gha2(R, phi0, lamb0, phi1, lamb1)
phi1 = wu.rad2deg(phi1)
lamb1 = wu.rad2deg(lamb1)
alpha0_g = wu.rad2deg(alpha0_g)
alpha1 = wu.rad2deg(alpha1)
print(kugel_erste_gha(R, phi_1, lamb_1, s, a_12))
print(kugel_zweite_gha(R, phi_1, lamb_1, phi_2, lamb_2))
pass