/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
asp og arccos problem
Fra : Jon Klose Larsen


Dato : 18-05-05 14:02

Hej

Jeg har et lille problem med noget beregning.

Jeg har nedenstående script, som får 2 positioner (breddegrad + længdegrad i
decimaler) og skal beregne afstanden mellem de 2 punkter.

calc_distance = 3963.0 * arccos(sin(lat1/57.2958) * sin(lat2/57.2958) +
cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lon2/57.2958 -lon1/57.2958))

Noget tyder på at asp ikke kender arccos ..... så hvordan klarer jeg den ?

Jeg er desværre ikke noget matematisk geni, så mine evner til at gennemskue
fejlen er ringe.


Jon



 
 
Søren Reinke (18-05-2005)
Kommentar
Fra : Søren Reinke


Dato : 18-05-05 14:09


"Jon Klose Larsen" <klose@post8fejl.tele.dk> wrote in message
news:428b3cc1$0$169$edfadb0f@dtext02.news.tele.dk...
> Hej
>
> Jeg har et lille problem med noget beregning.
>
> Jeg har nedenstående script, som får 2 positioner (breddegrad + længdegrad
> i decimaler) og skal beregne afstanden mellem de 2 punkter.
>
> calc_distance = 3963.0 * arccos(sin(lat1/57.2958) * sin(lat2/57.2958) +
> cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lon2/57.2958 -lon1/57.2958))
>
> Noget tyder på at asp ikke kender arccos ..... så hvordan klarer jeg den ?
>

Kig evt. her http://www.a1vbcode.com/snippet.asp?ID=3311 der viser de i
'code' boxen hvordan man beregner den.

--
Søren Reinke
www.Xray-Mag.com/ - Your free diving magazin on the net.
Current issue Diving in North America, 99 pages.
Download it in PDF



Søren Reinke (18-05-2005)
Kommentar
Fra : Søren Reinke


Dato : 18-05-05 14:11

>
> Noget tyder på at asp ikke kender arccos ..... så hvordan klarer jeg den ?
>

Eller her:
http://www.mp2kmag.com/articles.asp?ArticleID=13

Function Arccos(x As Double) As Double
If x = 1 Then
Arccos = 0
Exit Function
End If
Arccos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
End Function


--
Søren Reinke
www.Xray-Mag.com/ - Your free diving magazin on the net.
Current issue Diving in North America, 99 pages.
Download it in PDF



Jon Klose Larsen (18-05-2005)
Kommentar
Fra : Jon Klose Larsen


Dato : 18-05-05 14:38


"Søren Reinke" <soren@reinke.fjernmig.dk> skrev i en meddelelse
news:d6feta$18vg$1@newsbin.cybercity.dk...
> >
>> Noget tyder på at asp ikke kender arccos ..... så hvordan klarer jeg den
>> ?
>>
>
> Eller her:
> http://www.mp2kmag.com/articles.asp?ArticleID=13
>
> Function Arccos(x As Double) As Double
> If x = 1 Then
> Arccos = 0
> Exit Function
> End If
> Arccos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
> End Function
>

Tak for budet, men det ser desværre ikke ud til at give det ventede
resultat.

Min script ser nu sådan her ud:

*****************************************
x = (sin(lat1/57.2958) * sin(lat2/57.2958)) + (cos(lat1/57.2958) *
cos(lat2/57.2958) * cos(lon2/57.2958 - lon1/57.2958))

If x = 1 Then
Arccos = 0
else
Arccos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
End If

calc_distance = 3963.0 * Arccos
******************************************

Det kører, men output er ikke korrekt.

F.eks. får jeg et resultat på godt 7000 når det burde ligge på under 300.

Åben for yderligere forslag.

Jon



Kasper Lindberg (18-05-2005)
Kommentar
Fra : Kasper Lindberg


Dato : 18-05-05 16:34

> Det kører, men output er ikke korrekt.
>
> F.eks. får jeg et resultat på godt 7000 når det burde ligge på under 300.
>
> Åben for yderligere forslag.
>

et forslag kunne være


   Function ACos(t)
      If ABS(t)<=1 Then
         if t<0 then
            ACos=4*Atn(1)+Atn(((1-t^2)^(1/2))/t)
         ElseIf t=0 then
            ACos=2*Atn(1)
         else
            ACOS=Atn(((1-t^2)^(1/2))/t)
         end if
      end if
   End Function

Jeg fik funktionen serveret i forbindelse med en lommeregner jeg skulle lave.
den burde være gennemtestet, men prøv lige selv også :D

håber du kan bruge den


/Kasper

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jon Klose Larsen (18-05-2005)
Kommentar
Fra : Jon Klose Larsen


Dato : 18-05-05 18:40

> et forslag kunne være
>
>
> Function ACos(t)
> If ABS(t)<=1 Then
> if t<0 then
> ACos=4*Atn(1)+Atn(((1-t^2)^(1/2))/t)
> ElseIf t=0 then
> ACos=2*Atn(1)
> else
> ACOS=Atn(((1-t^2)^(1/2))/t)
> end if
> end if
> End Function
>
> /Kasper
>

Hej Kasper

Tak for dit forslag, men jeg kan stadig ikke få det til at virke.

For lige at trække det hele op igen, er her en kort gennemgang, samt den del
af koden der fejler.

Jeg har 4 input data (lat1, lon1, lat2, lon2), alle hentet fra extern side,
parsed og puttet i en array.

Derefter skal jeg finde afstanden i Km eller Nm, hvilket fejler, som det er
tydeligt at se på de output data som jeg har sat ind nedenfor. Specielt det
første sæt data viser tydeligt mit problem, da der stort set ikke er afstand
mellem de to punkter.

Det sjove ved det hele er, at hvis jeg isolerer beregningen i en seperat fil
og bruger faste data, så virker det ok.

Yderligere forslag meget velkomne (hjælp!!)

Jon


Her er min kode:

********** Kode ****************
if isnumeric(outarray(bx,5)) and isnumeric(outarray(bx,6)) and
isnumeric(outarray(bx,33)) and isnumeric(outarray(bx,34)) then
lat1 = cdbl(outarray(bx,5))
lon1 = cdbl(outarray(bx,6))
lat2 = cdbl(outarray(bx,33))
lon2 = cdbl(outarray(bx,34))

response.write "lat1: " & lat1 & "&nbsp;&nbsp;&nbsp;" & "lon1: " &
lon1 & "<br>"
response.write "lat2: " & lat2 & "&nbsp;&nbsp;&nbsp;" & "lon2: " &
lon2 & "<br>"

t = (sin(lat1/57.2958) * sin(lat2/57.2958)) + (cos(lat1/57.2958) *
cos(lat2/57.2958) * cos(lon2/57.2958 - lon1/57.2958))

If ABS(t)<=1 Then
if t<0 then
ACos=4*Atn(1)+Atn(((1-t^2)^(1/2))/t)
ElseIf t=0 then
ACos=2*Atn(1)
else
ACos=Atn(((1-t^2)^(1/2))/t)
end if
end if

rslogger("distance") = cdbl(6378.7 * ACos)
stemp = cdbl(6378.7 * ACos)

response.write "distance1: " & rslogger("distance") & " km<br>"
response.write "distance2: " & stemp & " km<br>"
response.write "<br>"
else
rslogger("distance") = -1
end if

********* Kode slut **************



********** Output *************
lat1: 35.75981 lon1: 10.75314
lat2: 35.758056 lon2: 010.754722
distance1: 14149 km
distance2: 14149,06286285 km

lat1: 4.66280 lon1: -91.47313
lat2: 19.435278 lon2: -099.072222
distance1: 15878 km
distance2: 15877,9022726016 km

lat1: 36.77643 lon1: -85.99958
lat2: 44.880547 lon2: -093.216922
distance1: 18580 km
distance2: 18580,161410359 km

lat1: 50.57116 lon1: 19.29144
lat2: 50.077731 lon2: 019.784836
distance1: 8682 km
distance2: 8681,74592041452 km

lat1: 46.95352 lon1: -71.27975
lat2: 51.443611 lon2: -057.185278
distance1: 9150 km
distance2: 9149,65612683432 km
********************************



Jon Klose Larsen (18-05-2005)
Kommentar
Fra : Jon Klose Larsen


Dato : 18-05-05 18:54

Her er lidt yderligere output data, med lidt flere variabler udskrevet (hvis
det kan være til hjælp)

Igen her, så er den første den mest åbenbare, med hensyn til fejl.

Jon

> ********** Output *************
lat1: 47.43837 lon1: 19.22819
lat2: 47.439328 lon2: 019.261808
t: -0,833927025605711
ACos 2,55698201099587
distance1: 16310 km
distance2: 16310,2211535394 km

lat1: 55.64322 lon1: -8.81276
lat2: 52.308056 lon2: 004.764167
t: 6,47328560465485E-02
ACos 1,50601817647899
distance1: 9606 km
distance2: 9606,4381423065 km

lat1: 47.55959 lon1: 9.03050
lat2: 47.458194 lon2: 008.548000
t: -0,166019373902782
ACos 1,73758796770595
distance1: 11084 km
distance2: 11083,5523696059 km

lat1: 39.15565 lon1: -102.15883
lat2: 35.393089 lon2: -097.600733
t: 0,338334559048545
ACos 1,22564980779789
distance1: 7818 km
distance2: 7818,05242900043 km

lat1: 34.63775 lon1: -10.14102
lat2: 51.874444 lon2: -000.368333
t: 0,583700146360823
ACos 0,947518057435518
distance1: 6044 km
distance2: 6043,93343296394 km
> ********************************
>



Torben Brandt (19-05-2005)
Kommentar
Fra : Torben Brandt


Dato : 19-05-05 02:40

Jon Klose Larsen wrote in dk.edb.internet.webdesign.serverside.asp:
> Det sjove ved det hele er, at hvis jeg isolerer beregningen i en seperat fil
> og bruger faste data, så virker det ok.

... hvilket er en god indikation af at beregning er rigtig, men noget andet går
galt! :)

Jeg har kommenteret herunder (visse dele af koden er ikke citeret)

> Her er min kode:
>
> ********** Kode ****************
> if isnumeric(outarray(bx,5)) and isnumeric(outarray(bx,6)) and
> isnumeric(outarray(bx,33)) and isnumeric(outarray(bx,34)) then
> lat1 = cdbl(outarray(bx,5))
> lon1 = cdbl(outarray(bx,6))
> lat2 = cdbl(outarray(bx,33))
> lon2 = cdbl(outarray(bx,34))

På dette sted er lon2 et tal

> response.write "lat1: " & lat1 & "   " & "lon1: " & lon1 & "<br>"
> response.write "lat2: " & lat2 & "   " & "lon2: " & lon2 & "<br>"

Du får så et output som fx er:
> lat2: 35.758056 lon2: 010.754722

Her er noget galt for ASP kunne aldrig(?) finde på at udskrive et tal med
foranstillet 0 (altså 010.754722 i stedet for 10.754722).

Jeg tror at det du får udskrevet ikke er de tal du bruger i selve beregningen,
men i stedet de bagvedliggende data, som stadig er strenge.
Altså du henter strengen "010.754722" i databasen og så er det den du ubehandlet
får udskrevet.
Er du sikker på at output er dannet ved at køre præcis den kode du har sendt med
output ?

Nå, ovenstående var vist et lille sidespring, men min pointe er at hvis man
kører med dansk talformat (hvilket sikkert er standard, hvis du ikke har ændret
noget), så bliver
CDbl("010.754722") til tallet 10754722
mens
CDbl("010,754722") bliver til tallet 10,754722

> ********** Output *************
> lat1: 35.75981 lon1: 10.75314
> lat2: 35.758056 lon2: 010.754722
> distance1: 14149 km
> distance2: 14149,06286285 km

Hvis man gennemgår dine beregninger med de forkerte tal (altså dem, hvor kommaet
er forsvundet) så får man dine tal.
Hvis man sikrer sig at kommaet ikke forsvinder, så får jeg ovenstående eksempel
til 0,241986. Jeg kan ikke bedømme om det er rigtigt, men der lyder
fornuftigt... :)

En mulig rettelse kunne være at ændre
lat1 = cdbl(outarray(bx,5))
til
lat1 = cdbl(replace(outarray(bx,5), ".", ",")
Rettelsen skal selvfølgelig laves for alle 4 koordinater.

Håber det løser dit problem,
Torben

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jon Klose Larsen (19-05-2005)
Kommentar
Fra : Jon Klose Larsen


Dato : 19-05-05 07:40

>> ********** Output *************
>> lat1: 35.75981 lon1: 10.75314
>> lat2: 35.758056 lon2: 010.754722
>> distance1: 14149 km
>> distance2: 14149,06286285 km
>
> Hvis man gennemgår dine beregninger med de forkerte tal (altså dem, hvor
> kommaet
> er forsvundet) så får man dine tal.
> Hvis man sikrer sig at kommaet ikke forsvinder, så får jeg ovenstående
> eksempel
> til 0,241986. Jeg kan ikke bedømme om det er rigtigt, men der lyder
> fornuftigt... :)
>
> En mulig rettelse kunne være at ændre
> lat1 = cdbl(outarray(bx,5))
> til
> lat1 = cdbl(replace(outarray(bx,5), ".", ",")
> Rettelsen skal selvfølgelig laves for alle 4 koordinater.
>
> Håber det løser dit problem,
> Torben

Hej Torben

Hvorfor kan man aldrig se skoven for bare træer ??

Dir forslag var det rigtige.... nu virker det helt perfekt.

Mange tak for hjælpen

Jon



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste