Avatar billede gil-galad Nybegynder
15. februar 2005 - 16:27 Der 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??

Scriptet:

#!/usr/local/bin/perl -w
use POSIX;
use strict;
my($pi) = 4*atan2(1,1);
my($x,$y,$z,$L,$B);
my($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];
  ($y,$z) = ($y*cos($a)+$z*sin($a),-$y*sin($a)+$z*cos($a));
  return ($x,$y,$z);
}

sub rotay {
  my ($a,$x,$y,$z) = @_[0,1,2,3];
  ($x,$z) = ($x*cos($a)-$z*sin($a),$x*sin($a)+$z*cos($a));
  return ($x,$y,$z);
}

sub rotaz {
  my ($a,$x,$y,$z) = @_[0,1,2,3];
  ($x,$y) = ($x*cos($a)+$y*sin($a),-$x*sin($a)+$y*cos($a));
  return ($x,$y,$z);
}

my($t,$m,$d,$min,$max);
($L,$B) = (10*$pi/180,56*$pi/180);
for $d (0..364) {
  $min = 0;
  $max = 0;
  for $m (0..24*60) {
    $t = $d*24*60+$m-12*60+8*24*60-60;
    ($x,$y,$z) = ($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
    ($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
    ($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
    ($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
    if ($x > 0) {
      $min = $m if $min == 0;
      $max = $m;
    }
  }
  print "P o $d $min\nL o o\n";
  print "P o $d $max\nL o o\n";
}
print "P o 1 0\nL o o\n";
print "P o 1 ".(24*60)."\nL o o\n";
Avatar billede Daniel.E Praktikant
18. februar 2005 - 09:32 #1
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
Avatar billede 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);

  //  return ($x,$y,$z);
  return array($x,$nyt_y,$nyt_z);

}

//sub rotay {
//  my ($a,$x,$y,$z) = @_[0,1,2,3];
//  ($x,$z) = ($x*cos($a)-$z*sin($a),$x*sin($a)+$z*cos($a));
//  return ($x,$y,$z);
//}

function rotay($a,$x,$y,$z){
  $nyt_x=$x*cos($a)-$z*sin($a);
  $nyt_z=$x*sin($a)+$z*cos($a);
  return array($nyt_x,$y,$nyt_z);
}

//sub rotaz {
//  my ($a,$x,$y,$z) = @_[0,1,2,3];
//  ($x,$y) = ($x*cos($a)+$y*sin($a),-$x*sin($a)+$y*cos($a));
//  return ($x,$y,$z);
//}

function rotaz($a,$x,$y,$z){
  $nyt_x=$x*cos($a)+$y*sin($a);
  $nyt_y=-$x*sin($a)+$y*cos($a);
  return array($nyt_x,$nyt_y,$z);
}

//my($t,$m,$d,$min,$max);
//($L,$B) = (10*$pi/180,56*$pi/180);
$L=10*$pi/180;
$B=56*$pi/180;

//for $d (0..364) {
foreach(range(0, 364) as $d){

  $min = 0;
  $max = 0;
//  for $m (0..24*60) {
  foreach(range(0,24*60) as $m) {
    $t = $d*24*60+$m-12*60+8*24*60-60;
//    ($x,$y,$z) = ($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
//    ($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
//    ($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
//    ($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
// Rigtig meget sjov med lister.
    list($x,$y,$z) = array($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
    list($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
    list($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
    list($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
    if ($x > 0) {
//      $min = $m if $min == 0;
      if($min == 0) {$min = $m;}
      $max = $m;
    }
  }
  print "P o $d $min\nL o o\n";
  print "P o $d $max\nL o o\n";
}
print "P o 1 0\nL o o\n";
print "P o 1 ".(24*60)."\nL o o\n";
Avatar billede gil-galad Nybegynder
18. februar 2005 - 13:30 #3
øhhh, ja.

Der er bare et sidste problem:
Sådan burde listen se ud når den bliver udskrevet:
http://www.246.dk/opnedtid.html

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...)

Hvad går der mon galt?
Avatar billede gil-galad Nybegynder
18. februar 2005 - 13:39 #4
eller det er måske ikke den rigtige kode jeg har haft fat i? det er lidt svært at overskue. se bunden af denne side: http://www.246.dk/solopned.html
Avatar billede Slettet bruger
18. februar 2005 - 14:10 #5
Jeg tror, at fidusen er, at koden udskriver data til et plotter-script, der kan lave diagrammer som dem på siden med koden.

Et script i den stil, som er på http://www.246.dk/phppl.html
Avatar billede gil-galad Nybegynder
18. februar 2005 - 14:17 #6
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.
Avatar billede 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";

Retter vi til:

$dato=mktime(0,0,0,1,1,2005)+$d*24*60*60;
$optid=$dato+$min*60;
$nedtid=$dato+$max*60;
print date('Y-m-d',$dato);
print " op: " . date('H:i',$optid);
print " ned: " . date('H:i',$nedtid);
print "\n";

Det burde klare det, hvis jeg har gennemskuet værdierne korrekt.
Avatar billede gil-galad Nybegynder
18. februar 2005 - 14:51 #8
det ser ud til at virke nu! Men Fatal error</b>:  Maximum execution time of 30 seconds exceeded in

kan man ikke begrænse det lidt, så den kun looper igennem en måned, eller de næste 7 dage?
Avatar billede gil-galad Nybegynder
18. februar 2005 - 14:56 #9
2005-02-18 op: 07:49 ned: 17:09    fra scriptet

Sol op/ned: 7:41/17:27    fra dmi

man burde jo på en eller anden måde indsætte en længde og breddegrad, før dette ville virke rigtigt?
Avatar billede Slettet bruger
18. februar 2005 - 15:24 #10
Jo, ret i denne linie for at ændre perioden, der beregnes for.

foreach(range(0, 364) as $d){

Næste 7 dage kan klares med:

foreach(range(date('z')+1,date('z')+7){

Og jo. Solen står ikke op samme tid alle steder. Hvor DMI regner med, ved jeg ikke.
Avatar billede Slettet bruger
18. februar 2005 - 15:25 #11
Hov:

foreach(range(date('z')+1,date('z')+7) as $d){
Avatar billede gil-galad Nybegynder
18. februar 2005 - 21:10 #12
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......
Avatar billede 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;

$tidszonekomp=(15*$tidszone-$laengde)*4;
$L=$laengde*$pi/180;
$B=$bredde*$pi/180;

Derudover skal der rettes to linier nede i løkken:

$optid=$dato+$min*60;
$nedtid=$dato+$max*60;

bliver til

$optid=$dato+$min*60-$tidszonekomp;
$nedtid=$dato+$max*60-$tidszonekomp;

Så mangler du egentlig bare at rette graderne til det sted, du gerne vil have tidspunkterne for.
Avatar billede gil-galad Nybegynder
19. februar 2005 - 02:51 #14
hmmm nu ser scriptet sådan ud:

<?php

//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;


// Indstillinger
$tidszone=1; // Forskel til GMT, husk at sommertid er =2
$laengde=10;
$bredde=56;

$tidszonekomp=(15*$tidszone-$laengde)*4;
$L=$laengde*$pi/180;
$B=$bredde*$pi/180;


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);

  //  return ($x,$y,$z);
  return array($x,$nyt_y,$nyt_z);

}

//sub rotay {
//  my ($a,$x,$y,$z) = @_[0,1,2,3];
//  ($x,$z) = ($x*cos($a)-$z*sin($a),$x*sin($a)+$z*cos($a));
//  return ($x,$y,$z);
//}

function rotay($a,$x,$y,$z){
  $nyt_x=$x*cos($a)-$z*sin($a);
  $nyt_z=$x*sin($a)+$z*cos($a);
  return array($nyt_x,$y,$nyt_z);
}

//sub rotaz {
//  my ($a,$x,$y,$z) = @_[0,1,2,3];
//  ($x,$y) = ($x*cos($a)+$y*sin($a),-$x*sin($a)+$y*cos($a));
//  return ($x,$y,$z);
//}

function rotaz($a,$x,$y,$z){
  $nyt_x=$x*cos($a)+$y*sin($a);
  $nyt_y=-$x*sin($a)+$y*cos($a);
  return array($nyt_x,$nyt_y,$z);
}

//my($t,$m,$d,$min,$max);
//($L,$B) = (10*$pi/180,56*$pi/180);
$L=10*$pi/180;
$B=56*$pi/180;

//for $d (0..364) {
foreach(range(0, 364) as $d){

  $min = 0;
  $max = 0;
//  for $m (0..24*60) {
  foreach(range(0,24*60) as $m) {
    $t = $d*24*60+$m-12*60+8*24*60-60;
//    ($x,$y,$z) = ($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
//    ($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
//    ($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
//    ($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
// Rigtig meget sjov med lister.
    list($x,$y,$z) = array($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
    list($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
    list($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
    list($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
    if ($x > 0) {
//      $min = $m if $min == 0;
      if($min == 0) {$min = $m;}
      $max = $m;
    }
  }
$dato=mktime(0,0,0,1,1,2005)+$d*24*60*60;
$optid=$dato+$min*60-$tidszonekomp;
$nedtid=$dato+$max*60-$tidszonekomp;
print date('Y-m-d',$dato);
print " op: " . date('H:i',$optid);
print " ned: " . date('H:i',$nedtid);
print "<br>";
}
//print "P o 1 0\nL o o\n";
//print "P o 1 ".(24*60)."\nL o o\n";
?>


men jeg synes ikke at der er den store forskel??? men jeg laver nok en fejl, det er jo sent :-)
Avatar billede 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;
Avatar billede 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.
Avatar billede gil-galad Nybegynder
19. februar 2005 - 23:59 #17
du skal have mange tak for din hjælp, men jeg laver nok en eller anden dumme-fejl, da tiderne slet ikke passer mere?

koden:

<?php
// Indstillinger
$tidszone=1; // Forskel til GMT, husk at sommertid er =2
$laengde=12.5;
$bredde=55.5;


$pi=pi();
$R=40000000/2/$pi;

$tidszonekomp=(15*$tidszone-$laengde)*4*60;
$L=$laengde*$pi/180;
$B=$bredde*$pi/180;


function rotax($a,$x,$y,$z){
  $nyt_y=$y*cos($a)+$z*sin($a);
  $nyt_z=-$y*sin($a)+$z*cos($a);
  return array($x,$nyt_y,$nyt_z);

}

function rotay($a,$x,$y,$z){
  $nyt_x=$x*cos($a)-$z*sin($a);
  $nyt_z=$x*sin($a)+$z*cos($a);
  return array($nyt_x,$y,$nyt_z);
}

function rotaz($a,$x,$y,$z){
  $nyt_x=$x*cos($a)+$y*sin($a);
  $nyt_y=-$x*sin($a)+$y*cos($a);
  return array($nyt_x,$nyt_y,$z);
}

foreach(range(0, 364) as $d){

  $min = 0;
  $max = 0;
  foreach(range(0,24*60) as $m) {
    $t = $d*24*60+$m-12*60+8*24*60-60;
    list($x,$y,$z) = array($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
    list($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
    list($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
    list($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
    if ($x > 0) {
      if($min == 0) {$min = $m;}
      $max = $m;
    }
  }
$dato=mktime(0,0,0,1,1,2005)+$d*24*60*60;
$optid=$dato+$min*60-$tidszonekomp;
$nedtid=$dato+$max*60-$tidszonekomp;

print date('Y-m-d',$dato);
print " op: " . date('H:i',$optid);
print " ned: " . date('H:i',$nedtid)."<br>";
}
?>
Avatar billede Slettet bruger
20. februar 2005 - 18:04 #18
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;


$tidszonekomp=(15*$tidszone-$laengde)*4*60;
$L=$laengde*$pi/180;
$B=$bredde*$pi/180;



function rotax($a,$x,$y,$z){
  $nyt_y=$y*cos($a)+$z*sin($a);
  $nyt_z=-$y*sin($a)+$z*cos($a);
  return array($x,$nyt_y,$nyt_z);
}

function rotay($a,$x,$y,$z){
  $nyt_x=$x*cos($a)-$z*sin($a);
  $nyt_z=$x*sin($a)+$z*cos($a);
  return array($nyt_x,$y,$nyt_z);
}

function rotaz($a,$x,$y,$z){
  $nyt_x=$x*cos($a)+$y*sin($a);
  $nyt_y=-$x*sin($a)+$y*cos($a);
  return array($nyt_x,$nyt_y,$z);
}

$sidsteoptid=0;
$sidstenedtid=0;
$startminut=0;
$slutminut=24*60;


// d=dag i året
foreach(range($startdag, $slutdag) as $d){

  $min = 0;
  $max = 0;
 
  if($sidsteoptid>0){
    $startminut=$sidsteoptid-10;
    $slutminut=$sidsteoptid+10;
  }
 
  // m=minut på dagen
  foreach(range($startminut,$slutminut) as $m) {
    $t = ($d+10)*24*60+$m-12*60+8*24*60-60;
    list($x,$y,$z) = array($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
    list($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
    list($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
    list($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
    if ($x > 0) {
      if($min == 0) {$min = $m;}
    }
  }
 
  if($sidstenedtid>0){
    $startminut=$sidstenedtid-10;
    $slutminut=$sidstenedtid+10;
  }
   
  foreach(range($startminut,$slutminut) as $m) {
    $t = ($d+10)*24*60+$m-12*60+8*24*60-60;
    list($x,$y,$z) = array($R*cos($B)*cos($L),$R*cos($B)*sin($L),$R*sin($B));
    list($x,$y,$z) = rotaz(-$t/(24*(365.25/366.25)*60)*2*$pi,$x,$y,$z);
    list($x,$y,$z) = rotay(23*$pi/180,$x,$y,$z);
    list($x,$y,$z) = rotaz(+$t/(365.25*24*60)*2*$pi,$x,$y,$z);
    if ($x > 0) {
      $max = $m;
    }
  }
 
  $dato=mktime(0,0,0,1,1,2005)+$d*24*60*60;
  $optid=$dato+$min*60-$tidszonekomp;
  $nedtid=$dato+$max*60-$tidszonekomp;
  $sidsteoptid=$min;
  $sidstenedtid=$max;
  print date('Y-m-d',$dato);
  print " op: " . date('H:i',$optid);
  print " ned: " . date('H:i',$nedtid);
  print "<br>";
}
?>
Avatar billede gil-galad Nybegynder
20. februar 2005 - 21:22 #19
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?
Avatar billede 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.
Avatar billede gil-galad Nybegynder
06. marts 2005 - 15:25 #21
Jeg har ikke fået det til at virke tilfredsstillende, men smid et svar! Og mange tak for hjælpen
Avatar billede Slettet bruger
06. marts 2005 - 23:22 #22
Velbekomme. Jeg synes det var en lidt sjov og interessant opgave. Noget anderledes end de fleste spørgsmål her på exp.
Avatar billede gil-galad Nybegynder
08. marts 2005 - 12:36 #23
TAk for hjælpen... Hvis du falder over noget kode der virker mere tilfredsstillende, må du godt poste her :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester