in reply to Combine line segments to form a single line

update

Apparently I misunderstood the question, plz ignore this post!

Never mind! =)


like this?

DB<100> @AoA = ( [11,29, 10,25], [15,35, 11,29], [15,15, 11,21], [10,25, 11,21] ) DB<101> @flat = map { @$_ } @AoA => (11, 29, 10, 25, 15, 35, 11, 29, 15, 15, 11, 21, 10, 25, 11, 21)

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^2: Combine line segments to form a single line
by LanX (Saint) on Jan 12, 2014 at 22:19 UTC
    next try

    (not really trivial)

    use warnings; use strict; use Data::Dump; my @AoA = ( [11,29, 10,25], [15,35, 11,29], [15,15, 11,21], [10,25, 11,21], [15,35, 21,39], [25,40, 21,39], [21,11, 25,10], [15,15, 21,11], [35,35, 29,39], [29,39, 25,40], [35,15, 29,11], [25,10, 29,11], [40,25, 39,29], [35,35, 39,29], [39,21, 40,25], [35,15, 39,21], ); $"=","; my %neighbor; for ( @AoA) { my ($a,$b)= ("@$_[0,1]", "@$_[2,3]") ; push @{$neighbor{$b}}, $a; push @{$neighbor{$a}}, $b; }; #dd \%neighbor; #--- init my $next; my @path; my ($last,$current)=("11,29","10,25"); # start push @path, $last, $current; delete $neighbor{$last}; while ( %neighbor) { my $a_neighbors = delete $neighbor{$current}; die "Data corrupt: $current has no more neighbors" unless $a_neighbo +rs; ($next) = grep { $_ ne $last } @$a_neighbors; ($last,$current)=($current,$next); push @path, $current ; } #dd \@path; my @flat= map { split ",", $_ } @path; print join ",", @flat;

    output

    11,29,10,25,11,21,15,15,21,11,25,10,29,11,35,15,39,21,40,25,39,29,35,3 +5,29,39,25,40,21,39,15,35,11,29

    Cheers Rolf

    ( addicted to the Perl Programming Language)

      Thanks Rolf, that is very similar to the approach I was attempting myself. Unfortunately it only works when the line segments represent a complete cycle - see my comment below.
        > Unfortunately it only works when the line segments represent a complete cycle

        Nope!

        You just have to handle the case that $next becomes undef and leave the loop.

        The problem I rather see is to choose a starting point!

        Simplest solution: you choose one arbitrary edge and walk in both directions.

        Since %neighbour is symmetric this shouldn't be a problem, just swap the orientation of the start segment.

        I'm on mobile and I want you to understand the algorithm...so no code. :)

        Cheers Rolf

        ( addicted to the Perl Programming Language)