9 BEGIN { unshift @INC, qw(.); }
14 our %vxname2pos; # $vxname2pos{VXNAME} = Math::GSL::Vector
16 # ----- region names from plag, incl. reverse mapping -----
20 sub prep_region_rmap () {
21 foreach my $rn (keys %region) {
22 my $prs = plag_prs($rn);
23 die if $prs2region{$prs};
24 $prs2region{$prs} = $rn;
27 # bodgery for the sea and land
28 $prs2region{'NZ | L'} = 'NZ';
29 $prs2region{'L | NZ'} = 'NZ';
32 our $sre = qr{(?:(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
34 sub prs2r ($) { $prs2region{$_[0]} // confess "@_ ?" }
35 sub prs2rr ($) { $region{prs2r($_[0])} }
37 #----- file reader for plag output -----
41 # $region{NAME}{Adj}[]{Ends}[]{VxName}
42 # $region{NAME}{Adj}[]{Ends}[]{Pos}
43 # $region{NAME}{Polygon}{Pos}
46 # $region{NAME}{Adj}[]{Ends}[]{Adjoins}
47 # $region{NAME}{Polygon}{Adjoins}
48 # which should be ignored
50 open P, "<", $facesf or die $!;
51 while (<P>) { last if m/^\&faces$/; }
54 my $process_rr = sub {
56 if ($rr->{Name} eq 'NZ') {
57 # We combined L and NZ; now we must split them again
58 # in fact, we just throw away L entirely.
59 # Here, when processing NZ, we keep only vertices that
62 my $evxname = $_->{VxName};
63 my @eregions = split / \| ?/, $evxname;
64 grep { $_ eq 'NZ' } @eregions
67 $rr->{Polygon} = [ @edges ];
68 if ($rr->{Name} ne 'NZ') {
69 for my $ei (0..$#edges) {
70 my $ej = $ei % @edges;
71 if (!defined $last_ai) {
73 for my $ai (0..$#{ $rr->{Adj} }) {
74 next unless $rr->{Adj}[$ai]{Name} eq $edges[$ei]{Adjoins};
77 confess $edges[$ei]{Adjoins}.' ?' unless defined $last_ai;
79 my $ai = ($last_ai-1+@edges) % @edges;
81 my $adj = $rr->{Adj}[$ai];
82 confess Dumper($rr, \@edges, $ei, $ej, $adj, $last_ai, $ai)." ?"
83 unless $adj->{Name} eq $edges[$ei]{Adjoins};
86 $adj->{Ends}[$endi] = $edges[ ($ei + $endi) % @edges ];
95 $!=0; $_=<P> // confess $!;
99 $process_rr->() if $rr;
100 $rr= prs2rr($new_face);
101 } elsif (m/^\s+$sre$/) {
104 push @edges, { VxName => $vxname };
105 } elsif (m/^\s+\^adjoins\s+$sre$/) {
106 $edges[-1]{Adjoins} = prs2r($2);
107 } elsif (m/^\s+\^\@([-e.0-9]+)\,([-e.0-9]+)$/) {
108 my $pos = Math::GSL::Vector->new([$1,$2]);
109 confess unless defined $vxname;
110 $edges[-1]{Pos} = $pos;
111 $vxname2pos{$vxname} = $pos;
117 #----- main program -----
119 ($facesf, @ARGV) = @ARGV or die;
124 print Dumper(\%region);
127 # cperl-indent-level: 2