use strict;
use Carp;
+use Data::Dumper;
+use Math::GSL::Vector;
+use Math::GSL::Matrix;
BEGIN { unshift @INC, qw(.); }
use Parse;
+our $facesf;
our %vxname2pos; # $vxname2pos{VXNAME} = Math::GSL::Vector
-# ----- region name reverse mapping -----
+# ----- region names from plag, incl. reverse mapping -----
our %prs2region;
-foreach my $rn (keys %region) {
- my $prs = plag_prs($rn);
- die if $prs2region{$prs};
- $prs2region{$prs} = $rn;
+
+sub prep_region_rmap () {
+ foreach my $rn (keys %region) {
+ my $prs = plag_prs($rn);
+ die if $prs2region{$prs};
+ $prs2region{$prs} = $rn;
+ }
}
-my $sre = qr{(:?(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
+our $sre = qr{(?:(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
-sub prs2r ($) { $prs2region{$_[0]} // die "@_ ?" }
+sub prs2r ($) { $prs2region{$_[0]} // confess "@_ ?" }
sub prs2rr ($) { $region{prs2r($_[0])} }
#----- file reader for plag output -----
# also incidentally
# $region{NAME}{Adj}[]{Ends}[]{Adjoins} which should be ignored
- open F, "<", $facesf or die $!;
+ open P, "<", $facesf or die $!;
while (<P>) { last if m/^\&faces$/; }
my $rr;
my @edges;
my $process_rr = sub {
my $last_ai;
- for my $ei (0..@edges) {
+ for my $ei (0..$#edges) {
my $ej = $ei % @edges;
if (!defined $last_ai) {
my $ai;
- for my $ai (0..@{ $rr->{Adj} }) {
+ for my $ai (0..$#{ $rr->{Adj} }) {
next unless $rr->{Adj}[$ai]{Name} eq $edges[$ei]{Adjoins};
$last_ai = $ai+1;
}
confess unless defined $last_ai;
}
my $ai = ($last_ai-1+@edges) % @edges;
+ $last_ai = $ai;
my $adj = $rr->{Adj}[$ai];
- confess unless $adj->{Name} eq $edges[$ei]{Adjoins};
+ confess Dumper($rr, \@edges, $ei, $ej, $adj, $last_ai, $ai)." ?"
+ unless $adj->{Name} eq $edges[$ei]{Adjoins};
- for $endi (0..1) {
+ for my $endi (0..1) {
$adj->{Ends}[$endi] = $edges[ ($ei + $endi) % @edges ];
}
}
};
- while (<P>) {
+ my $vxname;
+ for (;;) {
+ $!=0; $_=<P> // confess $!;
+ last if m/^\&$/;
if (m/^$sre$/) {
$process_rr->() if $rr;
- my $rr= prs2rr($2);
+ $rr= prs2rr($2);
} elsif (m/^\s+$sre$/) {
confess unless $rr;
- my $vxname = $2;
+ $vxname = $2;
push @edges, { VxName => $vxname };
} elsif (m/^\s+\^adjoins\s+$sre$/) {
$edges[-1]{Adjoins} = prs2r($2);
- } elsif (m/^\s+\^\@(\w+)\.(\w+)$/) {
+ } elsif (m/^\s+\^\@([-e.0-9]+)\,([-e.0-9]+)$/) {
my $pos = Math::GSL::Vector->new([$1,$2]);
confess unless defined $vxname;
- $edges[-1]{Pos} = $pos;
+ #$edges[-1]{Pos} = $pos;
$vxname2pos{$vxname} = $pos;
}
}
#----- main program -----
-our ($facesf, @ARGV) = @ARGV or die;
+($facesf, @ARGV) = @ARGV or die;
parse_input_graph();
+prep_region_rmap();
read_faces();
-print Dumper(\%regions);
+print Dumper(\%region);
# Local variables:
# cperl-indent-level: 2