
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1310__algorithms/geo/Geo/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1310__algorithms/geo/Geo/Kube.pm |
package Geo::Kube;
use strict;
use Data::Dumper;
use Cwd;
sub DELIVER { 2 }
#**************************************************
sub new {
my $class = shift;
my $self = {};
$self->{'FILE'} = shift;
$self->{'METHOD'} = shift;
bless($self,$class);
$self->geodata();
return($self);
}
#******************************************************
sub geodata {
my $self = shift;
my $mode = shift;
my $VAR1; my $text; my $o;
if (!($self->{'GEODEEP'})) {
open(FFILE,"<".$self->{'FILE'});
$text = join("",<FFILE>);
close(FFILE);
if ($text =~ s/^(.*?)(\$VAR1 +\=[ \[\]013\,\n]+?)\;(.*)$/$1\n\n$3/s) {
eval($2);
$self->{'GEODEEP'} = $VAR1;
}
while ($text =~ s/^(.*?)\n *\n\s*([\-0123456789\,\n ]+?)\n *\n(.*)$/$1\n\n$3/s) {
$o = $2;
#print "W: $o\n";
if ($o =~ /\,\,/) {
$self->{'GEOBIN'} = $o . "\n";
}
elsif ($o =~ /\,.*\,/) {
$self->{'GEOFLAT'} = $o . "\n";
}
}
if ($text =~ s/^(.*?)\n *\n\s*([FNJ 10\n]+?)\n *\n(.*)$/$1\n\n$3/s) {
#print "hier\n";
$o = $2;
$self->{'GEOBYTE'} = $o;
}
if ($text =~ s/^(.*?)\n *\n\s*([0123456789ABCDEF\n ]+?)\n *\n(.*)$/$1\n\n$3/s) {
$o = $2;
$self->{'GEOHEX'} = $o;
}
}
}
#******************************************************
sub is_inside {
my $self = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $func = "is_inside_" . $self->{'METHOD'};
return($self->$func($x,$y,$z));
}
#******************************************************
sub is_inside_deep {
my $self = shift;
my $x = shift;
my $y = shift;
my $z = shift;
$x = sprintf("%020b",$x * 1048576); # umwandeln in binaer
$y = sprintf("%020b",$y * 1048576); # 1048576 = 2**20, das sollte reichen
$z = sprintf("%020b",$z * 1048576);
my $data = $self->{'GEODEEP'};
return("___NO_DATA___") if (!$data);
while (0 == 0) {
# print Dumper($data);
$data = $data->[ (substr($x,0,1))*1 + (substr($y,0,1))*2 + (substr($z,0,1))*4 ];
if (!(ref($data))) {
$data = 1 if ($data == 3);
return($data);
}
$x = substr($x,1);
$y = substr($y,1);
$z = substr($z,1);
}
}
#*******************************************************
sub is_inside_flat {
my $self = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $zeile; my $nr;
$x = sprintf("%020b",$x * 1048576); # umwandeln in binaer
$y = sprintf("%020b",$y * 1048576); # 1048576 = 2**20, das sollte reichen
$z = sprintf("%020b",$z * 1048576);
my $data = $self->{'GEOFLAT'};
return("___NO_DATA___") if (!$data);
$data = [split(/\n/,$data)];
# print Dumper($data);
my $nr = 0; # start at 0. flat octet
while (0 == 0) {
$zeile = [split(/,/,$data->[$nr])];
# print Dumper($zeile);
# print "$x\n$y\n$z\n";
# my $o = (substr($x,0,1))*4 + (substr($x,0,1))*2 + (substr($x,0,1))*1 ;
# print "RR $o\n";
$nr = $zeile->[ (substr($x,0,1))*1 + (substr($y,0,1))*2 + (substr($z,0,1))*4 ];
# print "NN: $nr\n";
if ($nr < 1) {
$nr = -1 if ($nr == -3);
return(-$nr);
}
$x = substr($x,1);
$y = substr($y,1);
$z = substr($z,1);
}
}
#*******************************************************
sub is_inside_bin {
my $self = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $zeile; my $nr; my $o; my $o1;
$x = sprintf("%020b",$x * 1048576); # umwandeln in binaer
$y = sprintf("%020b",$y * 1048576); # 1048576 = 2**20, das sollte reichen
$z = sprintf("%020b",$z * 1048576);
my $data = " " . $self->{'GEOBIN'} . " ";
return("___NO_DATA___") if (!$data);
$data =~ s/\n/ /gs;
while ($data =~ s/ +\d+ +/ /g) { 1; }
$data =~ s/ //g;
$data = [split(/,/,$data)];
# print Dumper($data); exit;
my $nr = 0; # start at 0. flat octet
while (0 == 0) {
$nr = 0;
# print "$x\n$y\n$z\n";
# print join("--",@$data) . "\n\n\n";
$o = (substr($x,0,1))*1 + (substr($y,0,1))*2 + (substr($z,0,1))*4;
while (0 == 0) {
#print "NN: $o $nr\n";
$nr = shift(@$data);
next if (!$nr);
$o = $o - 1;
last if ($o < 0);
}
# print "NN: $nr\n";
if ($nr < 1) {
# $nr = -1 if ($nr == -3);
$nr = 0 if ($nr == -7);
return(-$nr);
}
$nr = $nr - 1;
$data = [@{$data}[$nr..$#$data]];
$x = substr($x,1);
$y = substr($y,1);
$z = substr($z,1);
}
}
#*******************************************************
sub is_inside_byte {
my $self = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $zeile; my $o; my $o1;
$x = sprintf("%020b",$x * 1048576); # umwandeln in binaer
$y = sprintf("%020b",$y * 1048576); # 1048576 = 2**20, das sollte reichen
$z = sprintf("%020b",$z * 1048576);
# print "$x $y $z\n";
my $data = " " . $self->{'GEOBYTE'} . " ";
return("___NO_DATA___") if (!$data);
my $jump1 = "";
my $jump2 = "";
if ($data =~ /NJ +([01]+)/) {
$jump1 = length($1);
}
if ($data =~ /FJ +([01]+)/) {
$jump2 = length($1);
}
$data =~ s/\n/ /gs;
$data =~ s/ //gs;
my $nr = 0;
# print Dumper($data); exit;
while (0 == 0) {
#print "qqqq\n";
# print "$x\n$y\n$z\n$nr\n\n";
# sleep 1;
# print join("--",@$data) . "\n\n\n";
$o = (substr($x,0,1))*1 + (substr($y,0,1))*2 + (substr($z,0,1))*4;
while (0 == 0) {
#print "XXX: $o $nr " . substr($data,$nr,20) . "\n";
last if ($o == 0);
if (substr($data,$nr,1) eq "0") {
#print "xxx1\n";
$nr = $nr + 2;
}
elsif (substr($data,$nr,2) eq "NJ") {
#print "xxx9: " . substr($data,0,10) . "\n";
$nr = $nr + 2 + $jump1;
}
elsif (substr($data,$nr,2) eq "FJ") {
#print "xxx2: " . substr($data,0,10) . "\n";
$nr = $nr + 2 + $jump2;
}
$o = $o - 1;
}
#print "GGG: $nr " . substr($data,$nr,130) . " " . substr($data,$nr + 130,20) . "\n";
if (substr($data,$nr,1) eq "0") {
#print "hier\n";
return(substr($data,$nr+1,1));
}
if (substr($data,$nr,2) eq "NJ") {
#print "111 $nr\n";
$nr = $nr + eval("0b".substr($data,$nr+2,$jump1))*2;
#print "000 $nr\n";
}
elsif (substr($data,$nr,2) eq "FJ") {
#print "112 $nr $jump2\n";
$nr = $nr + eval("0b".substr($data,$nr+2,$jump2))*2;
}
$x = substr($x,1);
$y = substr($y,1);
$z = substr($z,1);
}
}
#*******************************************************
sub is_inside_hex {
my $self = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $zeile; my $o; my $o1;
$data = $self->{'GEOHEX'};
$x = sprintf("%020b",$x * 1048576);
$y = sprintf("%020b",$y * 1048576);
$z = sprintf("%020b",$z * 1048576);
$data =~ s/0/oooo/gs;
$data =~ s/1/oooi/gs;
$data =~ s/2/ooio/gs;
$data =~ s/3/ooii/gs;
$data =~ s/4/oioo/gs;
$data =~ s/5/oioi/gs;
$data =~ s/6/oiio/gs;
$data =~ s/7/oiii/gs;
$data =~ s/8/iooo/gs;
$data =~ s/9/iooi/gs;
$data =~ s/A/ioio/gs;
$data =~ s/B/ioii/gs;
$data =~ s/C/iioo/gs;
$data =~ s/D/iioi/gs;
$data =~ s/E/iiio/gs;
$data =~ s/F/iiii/gs;
$data =~ s/o/0/gs;
$data =~ s/i/1/gs;
$data =~ s/\n//gs;
my $jump = [eval("0b".substr($data,0,4))*2,eval("0b".substr($data,4,4))*2];
my $nr = 8;
while ($x) {
$o = (substr($x,0,1))*1 + (substr($y,0,1))*2 + (substr($z,0,1))*4;
while ($o != 0) {
if (substr($data,$nr,2) =~ /^1([01])$/) { $nr = $nr + $jump->[$1] }
$o = $o - 1;
$nr = $nr + 2;
}
last if (length($data) < $nr);
return(substr($data,$nr+1,1)) if (substr($data,$nr,1) eq "0");
if (substr($data,$nr,2) =~ /^1([01])$/) { $nr = $nr + eval("0b".substr($data,$nr+2,$jump->[$1]))*2 }
$x = substr($x,1);
$y = substr($y,1);
$z = substr($z,1);
}
return(9);
}
#**********************************************************************
1;