From 9210fd8cb6694f7478f9122efdf105470e2680b2 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 28 Feb 2019 18:40:14 +0000 Subject: [PATCH] wip --- generate-board | 65 ++++++++++++++++++++++++++++++++++++++++++++++++-- misc-data.pl | 7 ++++-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/generate-board b/generate-board index d9e83e2..08208cb 100755 --- a/generate-board +++ b/generate-board @@ -4,10 +4,16 @@ use strict; use Carp; use Data::Dumper; use Math::GSL::Vector; -use Math::GSL::Matrix; +use Math::GSL::Matrix qw/:all/; +use Math::GSL::Const; +use Math::GSL::CBLAS qw/:all/; +use Math::GSL::Machine qw/:all/; + +use POSIX qw(M_PI); BEGIN { unshift @INC, qw(.); } +our %c; require 'misc-data.pl'; use Parse; @@ -15,6 +21,9 @@ use Parse; our $facesf; our %vxname2pos; # $vxname2pos{VXNAME} = Math::GSL::Vector +sub TAU { M_PI * 2.0; } +sub MM2PT { 72.0 / 25.4; } + # ----- region names from plag, incl. reverse mapping ----- our %prs2region; @@ -131,7 +140,58 @@ sub calculate_centres () { $sum += $_->{Pos} foreach @$poly; $rr->{Centre} = $sum * (1.0 / @$poly); } - # my $cnortn = +} + +sub for_each_pos ($) { + my ($f) = @_; + foreach my $rr (values %region) { + $f->( \ $rr->{Centre} ); + foreach my $vertex (@{ $rr->{Polygon} }) { + $f->( \ $vertex->{Pos} ); + } + } +} + +sub transform_coordinates () { + # Adjusts coordinates in graph to be [0,0] .. top right (scaled) + # until it's all in PostScript points + my @or = map { $region{$_}{Centre} } $c{OrientRegions}; + my $dir = $or[1] - $or[0]; + my $theta = atan2 $dir->[1], $dir->[0]; + my $rotateby = (90 - $c{OrientBearing}) * TAU - $theta; + $rotateby += TAU*2; + $rotateby %= TAU; + my $s = sin($rotateby); + my $c = cos($rotateby); + my $transform = Math::GSL::Matrix->new([[ $c, $s ], + [ -$s, $c ]]); + my @lims; + foreach my $topend (qw(0 1)) { + my $v = $topend ? $GSL_DBL_MAX : $GSL_DBL_MIN; + push @lims, Math::GSL::new([$v,$v]); + } + for_each_pos(sub { + my ($pr) = @_; + my $y = Math::GSL::Vector->new(2); + gsl_blas_dgemv($CblasNoTrans, 1.0, $transform, $$pr, 0., $y) or confess; + gsl_blas_dcopy($$pr, $y) or confess; + foreach my $topend (qw(0 1)) { + foreach my $xy (qw(0 1)) { + my $now = $y->get($xy); + my $lim = $lims[$topend]->get($xy); + next if $topend ? ($now <= $lim) : ($now >= $lim); + $lims[$topend]->set($xy, $now); + } + } + }); + my $translate = -$lims[0]; + print STDERR "translate $translate\n"; + my $scale = $c{GraphScale} * MM2PT; + for_each_pos(sub { + my ($pr) = @_; + gsl_vector_add($$pr, $translate) or confess; + gsl_vector_scale($$pr, $scale) or confess; + }); } #----- main program ----- @@ -141,6 +201,7 @@ parse_input_graph(); prep_region_rmap(); read_faces(); calculate_centres(); +transform_coordinates(); print Dumper(\%region); diff --git a/misc-data.pl b/misc-data.pl index ef042a6..66a20a1 100644 --- a/misc-data.pl +++ b/misc-data.pl @@ -1,3 +1,6 @@ -our %c = ( - OrientRegions => [ 'Roer en Overmaas', 'Noorderzijlvest' ], +our %c = +( + OrientRegions => [ 'Roer en Overmaas', 'Noorderzijlvest' ], + OrientBearing => 0, + GraphScale => 25, ); -- 2.30.2