15. februar 2005 - 16:27Der er
22 kommentarer og 1 løsning
"Oversæt" pearl til PHP
Hej
Jeg har fundet dette script der beregner solen op, og nedgangstider. Men desværre er det lavet i Pearl (tror jeg da). Kan se det ligner PHP ret meget, men kan ikke helt finde rundt i det.. Er der mon nogen der kan hjælpe med at "oversætte" det??
hmm.. ja ok.. men der er altså ikke særlig meget at ændre.. hvis du kender PHP i forvejen, så kan du allerde selv se at:
print cos, sin variable deklerationer syntax
er ens...
Det som du skal ændre er:
sub rotaz { my ($a,$x,$y,$z) = @_[0,1,2,3];
I php vil de være noget med
sub rotaz($a,$x,$y,$z='3') {
Hvis du ikke kan finde ud af at lave en standard if sætning, og tyde det kode du har vist her. Så skal du læse noget mere på www.php.net
Synes godt om
Slettet bruger
18. februar 2005 - 13:00#2
vb2: Du har da vist ikke set ordentligt efter i koden. Der benyttes en hel del konverteringer til/fra arrays, som slet ikke findes på samme måde i PHP. (Og det hedder ikke sub i PHP.)
Her er et hurtigt forsøg med den oprindelige kode som kommentarer (undtagen, hvor jeg ikke har ændret):
//my($pi) = 4*atan2(1,1); // Ignoreres. Vi bruger bare PHPs indbyggede funktion pi(). $pi=pi();
//my($x,$y,$z,$L,$B); // Ignoreres. Erklærer blot variable som værende lokale indenfor det aktuelle scope.
//my($R) = 40000000/2/$pi; $R=40000000/2/$pi;
print "TR 0 0 5 1 0 0 0.00\n";
//sub rotax { // my ($a,$x,$y,$z) = @_[0,1,2,3]; function rotax($a,$x,$y,$z){
// ($y,$z) = ($y*cos($a)+$z*sin($a),-$y*sin($a)+$z*cos($a)); // Sjov med lister. Vi splitter bare op på to udregninger. // Jeg tror nok, at det smarte ved den metode er, at den fylder // værdierne i begge formler førudregning, så man ikke behøvede // lave nye variable. $nyt_y=$y*cos($a)+$z*sin($a); $nyt_z=-$y*sin($a)+$z*cos($a);
Men den ser sådan ud: TR 0 0 5 1 0 0 0.00 P o 0 537 L o o P o 0 948 L o o P o 1 537 L o o P o 1 949 L o o P o 2 537 L o o P o 2 950 L o o P o 3 536 L o o P o 3 951 L o o P o 4 536 L o o P o 4 952 L o o P o 5 535 L o o P o 5 953 L o o P o 6 535 L o o P o 6 954 L o o P o 7 534 L o o P o 7 956 L o o P o 8 534 L o o P o 8 957 L o o P o 9 533 L o o P o 9 958 L o o P o 10 532 L o o P o 10 959 L o o P o 11 531 L o o P o 11 961 L o o P o 12 531 L o o P o 12 962 L o o P o 13 530 L o o P o 13 964 L o o P o 14 529 L o o P o 14 965 L o o P o 15 527 L o o P o 15 967 L o o P o 16 526 L o o P o 16 968 L o o P o 17 525 L o o P o 17 970 osv..... (taget fra vis kilde, så \n bliver linieskift...)
hmmm hvordan kan man så få lavet sådan en liste over op-ned tiderne? findes der evt et andet script liggende der ude, det er jo ret uoverskueligt at se hvordan det fungerer med alle disse sinuser...
jeg har ellers ledt meget efter sådan et script, men det nærmeste jeg kunne finde var dette.
Synes godt om
Slettet bruger
18. februar 2005 - 14:41#7
Lad os prøve at lave lidt om. Så vidt jeg kan se, er $d lig med dag i året og og min og max er vistnok nummeret på det relevante minut på døgnet.
Den første print-line og de to sidste skal bare udkommenteres.
Disse to:
print "P o $d $min\nL o o\n"; print "P o $d $max\nL o o\n";
nej... men hvordan "ved" scriptet at vi ikke befinder os på den anden side af jorden??? der må jo være et eller andet tal der bestemmer dette......
Synes godt om
Slettet bruger
19. februar 2005 - 02:07#13
Mon ikke det er disse to:
$L=10*$pi/180; $B=56*$pi/180;
10 grader øst, 56 grader nord er i alt fald indenfor Danmark. Det er lidt sydøst for Skanderborg ifølge mit atlas.
Derudover kan det måske give en smule problemer, at tiden beregnes som ren lokal tid. Dvs. at man får egentlig tidspunkterne for op/ned, hvis tidszonen havde været baseret på det sted, man regner for.
Vi ligger i CET-tidszonen, som er en time øst for 0 grader. En time er = 360/24 = 15 grader. Dermed vil det måske give et bedre resultat, at regne for 15,56 i stedet for 10,56. Det vil bare give tider, der ligger tidligere end de fleste af os vil opleve i praksis, for 15 øst er helt ude ved Bornholm. Derudover er der problemet, at solen slet ikke står op i en direkte øst/vest-linie. Se http://www.dmi.dk/dmi/nogle_staar_solen_ikke_op_i_oest
En bedre løsning kunne være at kompensere for tidsforskellen mellem ens position og centeret for tidszonen. Dvs. at udregne forskellen i lokaltid på ens position og 15 grader og derefter trække den fra.
Hver grad der skal kompenseres for er = 60minutter/15 grader = 4 minutter. Det gør vi ved at rette de to linier til:
// Indstillinger $tidszone=1; // Forskel til GMT, husk at sommertid er =2 $laengde=10; $bredde=56;
//sub rotax { // my ($a,$x,$y,$z) = @_[0,1,2,3]; function rotax($a,$x,$y,$z){
// ($y,$z) = ($y*cos($a)+$z*sin($a),-$y*sin($a)+$z*cos($a)); // Sjov med lister. Vi splitter bare op på to udregninger. // Jeg tror nok, at det smarte ved den metode er, at den fylder // værdierne i begge formler førudregning, så man ikke behøvede // lave nye variable. $nyt_y=$y*cos($a)+$z*sin($a); $nyt_z=-$y*sin($a)+$z*cos($a);
men jeg synes ikke at der er den store forskel??? men jeg laver nok en fejl, det er jo sent :-)
Synes godt om
Slettet bruger
19. februar 2005 - 03:14#15
Den burde give tidspunkter, der er 20 minutter forskudt for den vi havde før. Så er det bare at finde den position, du ønsker at beregne for. Nej hov, jeg glemte jo at gange $tidszonekomp med 60, så den er i sekunder. Ret linien til
$tidszonekomp=(15*$tidszone-$laengde)*4*60;
Du kan prøve at rette $laengde og $bredde til andre værdier. København ligger f.eks. ca. på 12.5 øst 55.5 nord.
PS. Husk lige at slette de to gamle linier, der sætter længde og bredde, ellers vil den blive med med at regne ud for Skanderborg:
$L=10*$pi/180; $B=56*$pi/180;
Synes godt om
Slettet bruger
19. februar 2005 - 03:20#16
Måske vil jeg se på at optimere algoritmen, så den ikke regner ud for hvert eneste minut hver eneste dag. Så skulle det kunne lade sig gøre at udregne et helt år noget hurtigere.
Jeg har ved nærlæsning af http://www.246.dk/solopned.html fundet ud af, at det ikke er den korrekte dato, vi bruger som udgangspunkt. Den regner nemlig fra vintersolhverv til vintersolhverv. Måske hjælper det at kompensere for det.
Derudover har jeg rettet lidt i koden, så den ikke udregner helt så meget. Dermed er den nok ikke anvendelig langt mod nord, hvor der sker hurtigere forandringer i tidspunkterne omkring jævndøgn. Fidusen er, at den nu kun udregner for det første døgn og derefter kun udregner for 20 minutter omkring den foregående dags op og nedgangstid.
Endelig har jeg gjort det en smule lettere at indstille perioden, der skal beregnes for, og jeg har (lige som dig) fjernet de resterne af det gamle perl-kode.
<?php
$pi=pi(); $R=40000000/2/$pi;
// Indstillinger $tidszone=1; // Forskel til GMT, husk at sommertid er =2 $laengde=12.5; $bredde=55.5; $startdag=1; $slutdag=50;
ja, man må sige at scriptet kører meget hurtigere nu, og det er lidt smartere at man kan indskrænke visningen lidt. Men jeg forstår simpelthen ikke, at tiderne ikke passer? Se her:
2005-02-20 op: 07:00 ned: 17:15 fra scriptet - 12.5 øst 55.5 nord Sol op/ned: 7:26/17:25 fra dmi - Roskilde
er der mon en fejl i selve algoritmen?
Synes godt om
Slettet bruger
21. februar 2005 - 06:05#20
Fejl og fejl. Den er bevidst forsimplet, og det kan måske være en årsag til forskelle.
Citat fra siden: "vi tillader os at se bort fra det måske er en anden længdegrad, der vender mod solen i det præcise øjeblik hvor den nordlige halvkugle er vippet længst væk fra solen. Vi ser også bort fra at jordens bane om solen ikke er en perfekt cirkel".
Derudover ser algoritmen solen som et enkelt punkt, så den regner med solens centrum. Hvis andre tal går ud fra enten at solen skal være helt over horisonten eller kun netop have øverste kant over horisonten, kan det også give forskelle.
TAk for hjælpen... Hvis du falder over noget kode der virker mere tilfredsstillende, må du godt poste her :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.