sgutil.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:55 2010 from sgutil.pl 2007/03/21 3.9 KB.

#!/perl -w
# NAME: sgutil.pl
# AIM: some SG services
my $SG_BUCKET_SPAN = 0.125;
my $SG_EPSILON = 0.0000001;
#* Generate the unique scenery tile index for this bucket
#* The index is constructed as follows:
#* 9 bits - to represent 360 degrees of longitude (-180 to 179)
#* 8 bits - to represent 180 degrees of latitude (-90 to 89)
#* Each 1 degree by 1 degree tile is further broken down into an 8x8
#* grid.  So we also need:
#* 3 bits - to represent x (0 to 7)
#* 3 bits - to represent y (0 to 7)
#inline long int gen_index() const { return ((lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x; }
sub gen_index {
   my ($lon, $lat, $y, $x) = @_;
   ###prt( "gen_index from lon $lon, lat $lat, y $y, x $x \n" );
   return (($lon + 180) << 14) + (($lat + 90) << 6) + ($y << 3) + $x;
}
##my ($dlon, $dlat) = llxy_2_dll( $lon, $lat, $y, $x );
sub llxy_2_dll {   
   my ( $lon, $lat, $y, $x ) = @_;
   my $span = sg_bucket_span( $lat );
   return ( ($lon + ($x * $span)), ($lat + (($y * 8) / 60)) );
}
#SGBucket::SGBucket(const long int bindex) {
sub conv_bucket_index {
   my ($ind) = shift;
   my $index = $ind;
   my $lon = $ind >> 14;
   $ind -= $lon << 14;
   $lon -= 180;
   my $lat = $ind >> 6;
   $ind -= $lat << 6;
   $lat -= 90;
   my $y = $ind >> 3;
   $ind -= $y << 3;
   my $x = $ind;
   prt( "index $index equal lon $lon, lat $lat, y $y, x $x ...\n" );
   return ($lon, $lat, $y, $x);
}
#// return the horizontal tile span factor based on latitude
#static double sg_bucket_span( double l ) {
sub sg_bucket_span {
   my ($l) = shift;
    if ( $l >= 89.0 ) {
      return 360.0;
    } elsif ( $l >= 88.0 ) {
      return 8.0;
    } elsif ( $l >= 86.0 ) {
      return 4.0;
    } elsif ( $l >= 83.0 ) {
      return 2.0;
    } elsif ( $l >= 76.0 ) {
      return 1.0;
    } elsif ( $l >= 62.0 ) {
      return 0.5;
    } elsif ( $l >= 22.0 ) {
      return 0.25;
    } elsif ( $l >= -22.0 ) {
      return 0.125;
    } elsif ( $l >= -62.0 ) {
      return 0.25;
    } elsif ( $l >= -76.0 ) {
      return 0.5;
    } elsif ( $l >= -83.0 ) {
      return 1.0;
    } elsif ( $l >= -86.0 ) {
      return 2.0;
    } elsif ( $l >= -88.0 ) {
      return 4.0;
    } elsif ( $l >= -89.0 ) {
      return 8.0;
    }
   return 360.0;
}
#// Set the bucket params for the specified lat and lon
sub lon_lat_to_index {
# void SGBucket::set_bucket( double dlon, double dlat ) {
# // latitude first
   my ($dlon, $dlat) = @_;
   my ($lon, $lat, $y, $x);
# double span = sg_bucket_span( dlat );
   my $span = sg_bucket_span( $dlat );
#  double diff = dlon - (double)(int)dlon;
   my $diff = $dlon - int($dlon);
   ###prt( "ll2ind: lon $dlon, lat $dlat, span $span, diff $diff ...\n" );
    #// cout << "diff = " << diff << "  span = " << span << endl;
    #if ( (dlon >= 0) || (fabs(diff) < SG_EPSILON) ) {
    if ( ($dlon >= 0) || (abs($diff) < $SG_EPSILON) ) {
      $lon = int($dlon);
    } else {
      $lon = int($dlon - 1);
    }
   ###prt( "int lon = $lon ...\n" );
    #// find subdivision or super lon if needed
    # if ( span < SG_EPSILON ) { // polar cap
    if ( $span < $SG_EPSILON ) {
      $lon = 0;
      $x = 0;
    # } else if ( span <= 1.0 ) {
    } elsif ( $span <= 1.0 ) {
      ###my $dx = (($dlon - $lon) / $span);
      $x = int(($dlon - $lon) / $span);
      ###prt( "span LT 1.0 so x = $x ... dx = $dx \n" );
    } else {
      #if ( (dlon >= 0) || (fabs(diff) < SG_EPSILON) ) {
      if ( ($dlon >= 0) || (abs($diff) < $SG_EPSILON) ) {
         $lon = int( int($lon / $span) * $span);
      } else {
         #// cout << " lon = " << lon 
         #//  << "  tmp = " << (int)((lon-1) / span) << endl;
         $lon = int( int(($lon + 1) / $span) * $span - $span);
         if ( $lon < -180 ) {
            $lon = -180;
         }
      }
      $x = 0;
    }
    #// then latitude
    $diff = $dlat - int($dlat);
    if ( ($dlat >= 0) || (abs($diff) < $SG_EPSILON) ) {
      $lat = int($dlat);
    } else {
      $lat = int($dlat - 1);
    }
    $y = int(($dlat - $lat) * 8);
   return gen_index($lon, $lat, $y, $x);
}
1;   # includes MUST return TRUE!!!
# eof - sgutil.pl

index -|- top

checked by tidy  Valid HTML 4.01 Transitional