Where I start looking into the SVG path bounding box… starting simple.

For the simple case of a segment, we can go directly to the code:

 1 sub segment_bb ($P0, $P1) {
 2    my %r = (min => {}, max => {});
 3    for my $d (qw< x y >) {
 4       my ($p0, $p1) = ($P0->{$d}, $P1->{$d});
 5       ($r{min}{$d}, $r{max}{$d}) = ($p0 < $p1) ? ($p0, $p1) : ($p1, $p0);
 6    }
 7    return \%r;
 8 }

Although simple, this sets the stage also for future posts on more complicated stuff.

The function expects to receive the two endpoints of the segments, $\mathbf{P}_0$ and $\mathbf{P}_1$. They are represented as anonymous hashes that have a x and a y key - probably not the most efficient of representations… but whatever.

The algorithm is straightforward: for each of the two axes, we take the corresponding values from the input points and assign them to the minimum and the maximum. This results in a bounding box with the shape of an anonymous hash with two keys (min and max), each represented as a point with x and y.

And that’s it for this!