Welcome to mirror list, hosted at ThFree Co, Russian Federation.

BoundingBox.pm « Geometry « Slic3r « lib - github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3cd019f0cbf90d1310bae920a6da998020c2134a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package Slic3r::Geometry::BoundingBox;
use Moo;
use Slic3r::Geometry qw(X Y Z MIN MAX X1 Y1 X2 Y2);
use Storable qw();

has 'extents' => (is => 'ro', required => 1);

sub clone { Storable::dclone($_[0]) }

# 2D
sub new_from_points {
    my $class = shift;
    my ($points) = @_;
    
    my $bb = [ Slic3r::Geometry::bounding_box($points) ];
    return $class->new(extents => [
        [ $bb->[X1], $bb->[X2] ],
        [ $bb->[Y1], $bb->[Y2] ],
    ]);
}

# 3D
sub new_from_points_3D {
    my $class = shift;
    my ($points) = @_;
    
    return $class->new(extents => [ Slic3r::Geometry::bounding_box_3D($points) ]);
}

# four-arguments 2D bb
sub bb {
    my $self = shift;
    my $extents = $self->extents;
    return [ $extents->[X][MIN], $extents->[Y][MIN], $extents->[X][MAX], $extents->[Y][MAX] ];
}

sub polygon {
    my $self = shift;
    return Slic3r::Polygon->new_from_bounding_box($self->bb);
}

sub rotate {
    my $self = shift;
    my ($angle, $center) = @_;
    
    # rotate the 2D bounding box polygon and leave Z unaltered
    my $bb_p = $self->polygon;
    $bb_p->rotate($angle, $center);
    my @bb = $bb_p->bounding_box;
    $self->extents->[X][MIN] = $bb[X1];
    $self->extents->[Y][MIN] = $bb[Y1];
    $self->extents->[X][MAX] = $bb[X2];
    $self->extents->[Y][MAX] = $bb[Y2];
    
    $self;
}

sub scale {
    my $self = shift;
    my ($factor) = @_;
    
    for (@{$self->extents}) {
        $_ *= $factor for @$_[MIN,MAX];
    }
    
    $self;
}

sub size {
    my $self = shift;
    
    my $extents = $self->extents;
    return [ map $extents->[$_][MAX] - $extents->[$_][MIN], grep $extents->[$_], (X,Y,Z) ];
}

sub center {
    my $self = shift;
    
    my $extents = $self->extents;
    return [ map +($extents->[$_][MAX] + $extents->[$_][MIN])/2, grep $extents->[$_], (X,Y,Z) ];
}

sub center_2D {
    my $self = shift;
    return Slic3r::Point->new(@{$self->center}[X,Y]);
}

sub min_point {
    my $self = shift;
    return Slic3r::Point->new($self->extents->[X][MIN], $self->extents->[Y][MIN]);
}

sub max_point {
    my $self = shift;
    return Slic3r::Point->new($self->extents->[X][MAX], $self->extents->[Y][MAX]);
}

1;