GeoForum PIIG  :  GEODEZJA.PL czytaj GEOFORUM.GEODEZJA.pl
Witamy na GeoForum www.geoforum.geodezja.pl
Polskiego Internetowego Informatora Geodezyjnego www.geodezja.pl.
Służy ono dyskusjom i pytaniom związanym z geodezją i dziedzinami z nią powiązanymi.
Na wymianę informacji o imprezach, wydarzeniach, nowych rozwiązaniach technologicznych, instrumentach, wydawnictwach i ciekawych adresach internetowych związanych z geodezją przewidzieliśmy moderowane forum informacyjne GeoInfo PIIG'u znajdujące się pod adresem www.GeoInfo.geodezja.pl.
Ogłoszenia prosimy zamieszczać wyłącznie w dziele GeoOgłoszeń pod adresem www.geodezja.pl/ogloszenia .
Uwagi i pytanie prosimy kierować na e-mail info@geodezja.pl.
Zapraszamy!

Rejestrację można wykonać pod adresem http://www.geoforum.geodezja.pl/register.php?1 ale po dokonaniu rejestacji prosimy o przesłania maila z prośbą o aktywację konta.

GeoForum i GeoInfo są częścią Polskiego Internetowego Informatora Geodezyjnego www.geodezja.pl ISSN 1896-8317

 
Re: Normalna do klotoidy przez dany punkt
Autor: Vertex (---.dynamic.chello.pl)
Data: 09 maj 2017 - 08:08:22

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 Klotoidahot smileyByVal 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 domiarProstahot smileyByVal 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 = Klotoidahot smileyLi, akwadrat)
pomY = KlotoidaY(Li, akwadrat)
If UCase(LczyP) = "L" Then pomY = -pomY
b = domiarProstahot smileypomX, 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 domiarKlotoidahot smileyByVal 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 = Klotoidahot smileyb, 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 = Klotoidahot smileyb, 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



Temat Odsłon Napisane przez Wysłane
  Normalna do klotoidy przez dany punkt 2914 jeometra 2010-02-12 13:28
  Re: Normalna do klotoidy przez dany punkt 1596 Rych-Tak 2010-02-12 17:04
  Re: Normalna do klotoidy przez dany punkt 1182 jeometra 2010-02-12 18:03
  Re: Normalna do klotoidy przez dany punkt 742 everest 2017-05-08 20:02
  Re: Normalna do klotoidy przez dany punkt 980 Vertex 2017-05-09 08:08
  Re: Normalna do klotoidy przez dany punkt 698 everest 2017-05-09 10:27
  Re: Normalna do klotoidy przez dany punkt 620 Stanley 2017-05-11 20:24
  Re: Normalna do klotoidy przez dany punkt 633 everest 2017-05-16 11:35
  Re: Normalna do klotoidy przez dany punkt 575 Ku6i 2017-05-16 12:03
  Re: Normalna do klotoidy przez dany punkt 597 everest 2017-05-16 12:17
  Re: Normalna do klotoidy przez dany punkt 565 jeometra 2017-05-16 18:21
  Re: Normalna do klotoidy przez dany punkt 718 Vertex 2017-05-18 07:58


Akcja: ForaWątkiSzukajZaloguj
Przykro nam, ale tylko zarejestrowane osoby mogą pisać na tym forum.
GeoForum powered by Phorum.