From: Ian Jackson Date: Thu, 28 Feb 2019 13:28:02 +0000 (+0000) Subject: wip X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=5bbc4977b9fdba0c6076d33272476c204b4ceb6d;p=pandemic-rising-tide.git wip --- diff --git a/generate-board b/generate-board index 8ce82b6..bd0276a 100755 --- a/generate-board +++ b/generate-board @@ -2,25 +2,32 @@ 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 ----- @@ -33,45 +40,50 @@ sub read_faces () { # also incidentally # $region{NAME}{Adj}[]{Ends}[]{Adjoins} which should be ignored - open F, "<", $facesf or die $!; + open P, "<", $facesf or die $!; while (

) { 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 (

) { + my $vxname; + for (;;) { + $!=0; $_=

// 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; } } @@ -80,11 +92,12 @@ sub read_faces () { #----- 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