#!/usr/bin/perl
# DAS PROGRAMM NIMMT ALS ERSTEN UND EINZIGEN PARAMETER EINE PUNKTLISTE
# IM CREMER FORMAT PKT# - 7 - Y - X - H - CODE  UND TEILT DIESE FUER DIE BIBRACTE
# KARTENBLAETTER AUF
#
# Anwendungs Anleitung
#
# von www.activestate.com den perl interpreter fuer windows runterladen und installieren
# - die ganze istallation ist nicht kritisch und es werden auch keine wilden eintraege
#   in irgendwelche windowssystemdateien gemacht
#
# aufruf an der eingabeaufforderung:
# perl divider.pl <name der zu sortierenden koordinatendatei>
#
# am besten vorher ein neues verzeichnis erzeugen und das ganze da drinnen aufrufen
# (es werden ziemlich viele datein erzeugt)
# es wird natuerlich keine verantwortung fuer evtl. entstehende schaeden oder
# fehler uebernommen. benuetung auf eigene gefahr.
#
# ach ja: der algorithmus ist ueberhaupt nicht optimiert und fuer die 60k+ zeilen/
# koordinaten hat mein duron800 schon wit ueber fuenf minuten gebraucht ...

$miny=1000000; $minx=1000000;
$maxy=1;       $maxx=1;

$kartenseite = 200;
$yursprung = 720000;
$xursprung = 220000;

open(BIGFILE, $ARGV[0]) or die "$ARGV[0] can not be opened\n";
@zeilen = <BIGFILE>;
close(BIGFILE);

# min,max rechts- und hochwerte werden gesucht
$i=0;
foreach $zeile (@zeilen) {
    if (($zeile =~ /^\n/) || ($zeile =~ /^!/)) {
        $tmp = splice(@zeilen,$i,1);
        print "$tmp gezogen\n";
    }
    else {
        @teile = split(/ +/,$zeile);
        $y = $teile[3];
        $x = $teile[4];
        $miny = $y if ($y < $miny);
        $minx = $x if ($x < $minx);
        $maxy = $y if ($y > $maxy);
        $maxx = $x if ($x > $maxx);
    }
    $i++;
}

# linker/oberer Punkt auf der ersten Karte links oben
$yanfang = $miny - ($miny % $kartenseite);
$xanfang = $maxx - ($maxx % $kartenseite) + 200;
$yanfang = substr($yanfang,0,index($yanfang,"."));
$xanfang = substr($xanfang,0,index($xanfang,"."));

# wie weit geht es von linken/oberen punkt zum punkt am weitesten
# rechts unten incl. umrechnung in 200er schritten fuer die kacheln
# ..faktor ist jeweils die anzahl der kacheln
$deltay = $maxy - $yanfang;
$temp = $deltay / $kartenseite;
$rechtsfaktor = (substr($temp,0,index($temp,".")))+1;

$deltax = $xanfang - $minx;
$temp = $deltax / $kartenseite;
$hochfaktor = (substr($temp,0,index($temp,".")))+1;

# anzahl der durchlaufe
$temp = $hochfaktor * $rechtsfaktor;

# wie viele kacheln ist die kachel oben links von dem usrsprung entfernt
$dy = ($yanfang - $yursprung) / $kartenseite; # -> fuer dateinamen
$dx = ($xursprung - $xanfang) / $kartenseite; # zB bei dy = 3/ dy =15 kachel oben links 0315.kor

$gesamtpunkte = @zeilen;
$schleifen = 0; $summe = 0;

open(PROTO,">proto.txt") or die "Protokolldatei proto.txt kann nicht geschrieben werden";

# spalten werden nach rechts durchlaufen
for ($i=0; $i < $rechtsfaktor; $i++) {
    $ylinks = $yanfang + $i * $kartenseite;
    $yrechts = $yanfang + ($i+1) * $kartenseite;

    # zeilen werden jeweils von oben nach unten durchlaufen
    for ($k=0; $k < $hochfaktor; $k++) {
        print "Anzahl der Schleifen: $schleifen (von $temp)\n";
        splice(@temparray,0);  # liste fuer aktuelle pktdatei wird zurueckgesetzt
        $xunten = $xanfang - ($k+1) * $kartenseite;
        $xoben = $xanfang - $k * $kartenseite;

        $j=0;
        # fuer jede kachel wird die gesamte liste durchgechecked
        foreach $zeile(@zeilen) {
              @teile = split(/ +/,$zeile);
            $y = $teile[3];
            $x =  $teile[4];

            # check ob punkt innerhalb der kachel
            if ((($y > $ylinks) && ($y <= $yrechts)) && (($x >= $xunten) && ($x < $xoben))) {
                # $zeile = chomp($zeile)."\010\013";
                push(@temparray, $zeile);  # passende zeilen werden in liste gepackt
            }
            $j++;
        }

        $filename = (length($k + $dx) == 1) ? "0".($k + $dx) : ($k + $dx);
        $filename = (length($i + $dy) == 1) ? $filename."0".($i+$dy).".k" : $filename.($i+$dy).".k";

        $anzahl = @temparray;
        print PROTO "$filename von $ylinks/$xoben nach $yrechts/$xunten mit $anzahl Punkten\n";

        # nur wenn koordinatenanzahl in kachel groesser 0 wird eine koordinatendatei erzeugt
        if($anzahl > 0) {
            open(NEWFILE, ">$filename") or die "$filename kann nicht geschrieben werden\n";
            foreach $tempo (@temparray) {
                print NEWFILE $tempo;
            }
            close NEWFILE;
            print "$filename mit $anzahl Punkt(en) erzeugt\n";
            $summe = $summe + $anzahl;
            $blattanzahl++;
        }

        $schleifen++;
    }

}
$rest = @zeilen;
# rest war fuer debugging zwecke mitgeschrieben worden
open(REST,">reste.kor") or die "reste.kor kann nicht geschrieben werden\n";
foreach(@zeilen) {
    print REST $_;
}
close(REST);

# debugging info
print PROTO "gesamtpunkte: $gesamtpunkte\n";
#print PROTO "verteilte punte: $summe\n";
#print PROTO "restpunkte in feld: $rest\n";
print PROTO "anzahl der blaetter: $blattanzahl\n";
print PROTO "deltay: $deltay\n";
print PROTO "deltax: $deltax\n";
print PROTO "dy konstantes glied: $dy\n";
print PROTO "dx konstantes glied: $dx\n";
print PROTO "rechtsfaktor: $rechtsfaktor\n";
print PROTO "hochfaktor: $hochfaktor\n";
print PROTO "kleinster rechtswert: $miny\n";
print PROTO "kleinster hochwert:   $minx\n";
print PROTO "maximaler rechtswert: $maxy\n";
print PROTO "maximaler hochwert:   $maxx\n";
close(PROTO);









