9 BEGIN { unshift @INC, qw(.); }
11 require 'misc-data.pl';
16 our %vxname2pos; # $vxname2pos{VXNAME} = Math::GSL::Vector
18 # ----- region names from plag, incl. reverse mapping -----
22 sub prep_region_rmap () {
23 foreach my $rn (keys %region) {
24 my $prs = plag_prs($rn);
25 die if $prs2region{$prs};
26 $prs2region{$prs} = $rn;
29 # bodgery for the sea and land
30 $prs2region{'NZ | L'} = 'NZ';
31 $prs2region{'L | NZ'} = 'NZ';
34 our $sre = qr{(?:(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
36 sub prs2r ($) { $prs2region{$_[0]} // confess "@_ ?" }
37 sub prs2rr ($) { $region{prs2r($_[0])} }
39 #----- file reader for plag output -----
43 # $region{NAME}{Adj}[]{Ends}[]{VxName}
44 # $region{NAME}{Adj}[]{Ends}[]{Pos}
45 # $region{NAME}{Polygon}{Pos}
46 # $region{NAME}{Special}
49 # $region{NAME}{Adj}[]{Ends}[]{Adjoins}
50 # $region{NAME}{Polygon}{Adjoins}
51 # which should be ignored
53 open P, "<", $facesf or die $!;
54 while (<P>) { last if m/^\&faces$/; }
57 my $process_rr = sub {
59 if ($rr->{Name} eq 'NZ') {
60 # We combined L and NZ; now we must split them again
61 # in fact, we just throw away L entirely.
62 # Here, when processing NZ, we keep only vertices that
65 my $evxname = $_->{VxName};
66 my @eregions = split / \| ?/, $evxname;
67 grep { $_ eq 'NZ' } @eregions
70 $rr->{Polygon} = [ @edges ];
71 if ($rr->{Name} ne 'NZ') {
72 for my $ei (0..$#edges) {
73 my $ej = $ei % @edges;
74 if (!defined $last_ai) {
76 for my $ai (0..$#{ $rr->{Adj} }) {
77 next unless $rr->{Adj}[$ai]{Name} eq $edges[$ei]{Adjoins};
80 confess $edges[$ei]{Adjoins}.' ?' unless defined $last_ai;
82 my $ai = ($last_ai-1+@edges) % @edges;
84 my $adj = $rr->{Adj}[$ai];
85 confess Dumper($rr, \@edges, $ei, $ej, $adj, $last_ai, $ai)." ?"
86 unless $adj->{Name} eq $edges[$ei]{Adjoins};
89 $adj->{Ends}[$endi] = $edges[ ($ei + $endi) % @edges ];
98 $!=0; $_=<P> // confess $!;
102 $process_rr->() if $rr;
103 $rr= prs2rr($new_face);
104 } elsif (m/^\s+$sre$/) {
107 push @edges, { VxName => $vxname };
108 } elsif (m/^\s+\^adjoins\s+$sre$/) {
109 $edges[-1]{Adjoins} = prs2r($2);
110 } elsif (m/^\s+\^\@([-e.0-9]+)\,([-e.0-9]+)$/) {
111 my $pos = Math::GSL::Vector->new([$1,$2]);
112 confess unless defined $vxname;
113 $edges[-1]{Pos} = $pos;
114 $vxname2pos{$vxname} = $pos;
119 $region{$_}{Special} = 1 foreach qw(NZ L);
122 #----- geometry mangling -----
124 sub calculate_centres () {
126 # $region{NAME}{Centre}
127 foreach my $rr (values %region) {
128 next if $rr->{Special};
129 my $poly = $rr->{Polygon};
130 my $sum = Math::GSL::Vector->new(2);
131 $sum += $_->{Pos} foreach @$poly;
132 $rr->{Centre} = $sum * (1.0 / @$poly);
137 #----- main program -----
139 ($facesf, @ARGV) = @ARGV or die;
145 print Dumper(\%region);
148 # cperl-indent-level: 2