Kiedyś myślałem, że zostanę programistą, ale już się pogodziłem, że nie.
Poniżej rozwiązanie w VBA excela (wkleić tekst w nowy moduł makro w edytorze VBA, funkcje wywołujesz wpisując w komórce arkusza np. =rad2dms(1.7924).
Należy pamiętać o włączeniu wykonywania makr w excelu (na karcie deweloper)
Te objawienia miałem z 15 lat temu, więc czasem rozwiązanie jest nieeleganckie ale działa.
BTW tablice to czasy leśnych dziadków z SGP i inżynierowi nie przystoi z nich korzystać w dobie powszechnej dostępności narzędzi obliczeniowych.
a i tak, żeby nie nawalić jak kot w mąkę to jednak lepiej używać dedykowanego oprogramowania do obliczeń geodezyjnych.
PZDR
<----------------- odtąd skopiować i wkleić
Option Explicit
Private Function silnia1(n As Integer) As Variant
Dim pom As Double, s As Integer
If n < 0 Then
silnia1 = "#[n<0]"
Else
pom = 1
For s = 1 To n
pom = pom * s
Next s
silnia1 = pom
End If
End Function
Function Klotoida
ByVal Li As Double, ByVal akwadrat As Double) As Variant
' obliczenia dla klotoidy jednostkowej akwadrat=1
Dim n As Integer, ile As Integer, pomX As Double, tau As Double
Li = Li / Sqr(akwadrat)
tau = Li ^ 2 / 2
If tau < 2.42 Then
ile = 15
pomX = 0#
For n = 1 To ile
pomX = pomX + (-1) ^ (n + 1) * ((Li ^ (4 * n - 3)) / _
(silnia1(2 * n - 2) * (4 * n - 3) * 2 ^ (2 * n - 2)))
Next n
KlotoidaX = pomX * Sqr(akwadrat)
Else: KlotoidaX = "#TAU>135°"
End If
End Function
Function KlotoidaY(ByVal Li As Double, ByVal akwadrat As Double) As Variant
Dim n As Integer, ile As Integer, pomY As Double, tau As Double
Li = Li / Sqr(akwadrat)
tau = Li ^ 2 / 2
If tau < 2.42 Then
ile = 15
pomY = 0#
For n = 1 To ile
pomY = pomY + (-1) ^ (n + 1) * ((Li ^ (4 * n - 1)) / _
(silnia1(2 * n - 1) * (4 * n - 1) * 2 ^ (2 * n - 1)))
Next n
KlotoidaY = pomY * Sqr(akwadrat)
Else: KlotoidaY = "#TAU>135°"
End If
End Function
Function długość(ByVal Xp As Double, ByVal Yp As Double, _
ByVal Xk As Double, ByVal Yk As Double) As Double
Dim dl As Double
dl = Sqr((Xk - Xp) ^ 2 + (Yk - Yp) ^ 2)
długość = dl
End Function
Function Azymut(ByVal Xp As Double, ByVal Yp As Double, _
ByVal Xk As Double, ByVal Yk As Double) As Variant
Dim dx As Double, dy As Double
Dim pi As Double
pi = 4 * Atn(1)
dx = Xk - Xp
dy = Yk - Yp
If Not (dx = 0 And dy = 0) Then
If dx > 0 And dy >= 0 Then Azymut = Atn(Abs(dy / dx))
If dx < 0 And dy > 0 Then Azymut = pi - Atn(Abs(dy / dx))
If dx < 0 And dy < 0 Then Azymut = pi + Atn(Abs(dy / dx))
If dx > 0 And dy < 0 Then Azymut = 2 * pi - Atn(Abs(dy / dx))
If dx = 0 And dy > 0 Then Azymut = pi / 2
If dx < 0 And dy = 0 Then Azymut = pi
If dx = 0 And dy < 0 Then Azymut = 3 / 2 * pi
Else: Azymut = "#dx0dy0"
End If
End Function
Function domiarProsta
ByVal b As Double, ByVal d As Double, ByVal Xp As Double, ByVal Yp As Double, _
ByVal Xk As Double, ByVal Yk As Double, Optional ByVal dm As Variant) As Double
Dim bk As Double
If Not IsMissing(dm) Then
bk = b + (długość(Xp, Yp, Xk, Yk) - dm) / dm * b
Else: bk = b
End If
domiarProstaX = Xp + bk * Cos(Azymut(Xp, Yp, Xk, Yk)) - _
d * Sin(Azymut(Xp, Yp, Xk, Yk))
End Function
Function domiarProstaY(ByVal b As Double, ByVal d As Double, ByVal Xp As Double, ByVal Yp As Double, _
ByVal Xk As Double, ByVal Yk As Double, Optional ByVal dm As Variant) As Double
Dim bk As Double
If Not IsMissing(dm) Then
bk = b + (długość(Xp, Yp, Xk, Yk) - dm) / dm * b
Else: bk = b
End If
domiarProstaY = Yp + bk * Sin(Azymut(Xp, Yp, Xk, Yk)) + _
d * Cos(Azymut(Xp, Yp, Xk, Yk))
End Function
Function KlotoidaXOY(ByVal XczyY As String, ByVal LczyP As String, ByVal Li As Double, ByVal akwadrat As Double, _
ByVal PoczątekX As Double, ByVal PoczątekY As Double, _
ByVal PunktZwrotuX As Double, ByVal PunktZwrotuY As Double) As Variant
Dim pomX As Double, pomY As Double, d As Double, b As Double
pomX = 0#
pomY = 0#
pomX = Klotoida
Li, akwadrat)
pomY = KlotoidaY(Li, akwadrat)
If UCase(LczyP) = "L" Then pomY = -pomY
b = domiarProsta
pomX, pomY, PoczątekX, PoczątekY, PunktZwrotuX, PunktZwrotuY)
d = domiarProstaY(pomX, pomY, PoczątekX, PoczątekY, PunktZwrotuX, PunktZwrotuY)
If UCase(XczyY) = "X" Then
KlotoidaXOY = b
ElseIf UCase(XczyY) = "Y" Then KlotoidaXOY = d
Else: KlotoidaXOY = "#XczyY"
End If
End Function
Function Rad2DMS(ByVal Kąt As Double, Optional ByVal IleZerSek As Variant) As String
Dim d As String, m As String, s As String
Dim pi As Double, zera As String, i As Integer
pi = Atn(1) * 4
If Not IsMissing(IleZerSek) Then
If IleZerSek < 1 Then
zera = "0"
Else: zera = "0."
End If
For i = 1 To IleZerSek
zera = zera + "0"
Next i
Else: zera = "0"
End If
Kąt = Kąt * 180 / pi 'zamiana radianów na DEG
If (Kąt < 0) And (Fix(Kąt)) = 0 Then
d = "-0"
Else: d = Str(Fix(Kąt))
End If
m = Str(Abs(Fix((Abs(Kąt) - Fix(Abs(Kąt))) * 60)))
s = Format(Abs(((Abs(Kąt) - Fix(Abs(Kąt))) * 60) _
- Fix(((Abs(Kąt) - Fix(Abs(Kąt))) * 60))) * 60, zera)
Rad2DMS = d + "°" + m + "'" + s + """"
End Function
Function domiarKlotoida
ByVal LczyP As String, ByVal b As Double, ByVal d As Double, ByVal akwadrat As Double, _
ByVal PoczątekX As Double, ByVal PoczątekY As Double, _
ByVal PunktZwrotuX As Double, ByVal PunktZwrotuY As Double) As Double
Dim Xklot As Double, Yklot As Double, LP As Integer
Dim Xpomoc As Double, az As Double, pi As Double, tau As Double
If UCase(LczyP) = "P" Then
LP = 1
Else: LP = -1
End If
pi = 4 * Atn(1)
Xklot = Klotoida
b, akwadrat)
Yklot = KlotoidaY(b, akwadrat)
az = Azymut(PoczątekX, PoczątekY, PunktZwrotuX, PunktZwrotuY)
Xpomoc = PoczątekX + Xklot * Cos(az) - Yklot * Sgn(LP) * Sin(az)
tau = b * b / 2 / akwadrat * Sgn(LP) + az + pi / 2
domiarKlotoidaX = Xpomoc + d * Cos(tau)
End Function
Function domiarKlotoidaY(ByVal LczyP As String, ByVal b As Double, ByVal d As Double, ByVal akwadrat As Double, _
ByVal PoczątekX As Double, ByVal PoczątekY As Double, _
ByVal PunktZwrotuX As Double, ByVal PunktZwrotuY As Double) As Double
Dim Xklot As Double, Yklot As Double, LP As Integer
Dim Ypomoc As Double, az As Double, pi As Double, tau As Double
If UCase(LczyP) = "P" Then
LP = 1
Else: LP = -1
End If
pi = 4 * Atn(1)
Xklot = Klotoida
b, akwadrat)
Yklot = KlotoidaY(b, akwadrat)
az = Azymut(PoczątekX, PoczątekY, PunktZwrotuX, PunktZwrotuY)
Ypomoc = PoczątekY + Xklot * Sin(az) + Yklot * Sgn(LP) * Cos(az)
tau = b * b / 2 / akwadrat * Sgn(LP) + az + pi / 2
domiarKlotoidaY = Ypomoc + d * Sin(tau)
End Function