BoundingBox.pm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package Slic3r::Geometry::BoundingBox;
  2. use Moo;
  3. use Slic3r::Geometry qw(X Y Z MIN MAX X1 Y1 X2 Y2);
  4. use Storable qw();
  5. has 'extents' => (is => 'ro', required => 1);
  6. sub clone { Storable::dclone($_[0]) }
  7. # 2D
  8. sub new_from_points {
  9. my $class = shift;
  10. my ($points) = @_;
  11. my $bb = [ Slic3r::Geometry::bounding_box($points) ];
  12. return $class->new(extents => [
  13. [ $bb->[X1], $bb->[X2] ],
  14. [ $bb->[Y1], $bb->[Y2] ],
  15. ]);
  16. }
  17. # 3D
  18. sub new_from_points_3D {
  19. my $class = shift;
  20. my ($points) = @_;
  21. return $class->new(extents => [ Slic3r::Geometry::bounding_box_3D($points) ]);
  22. }
  23. # four-arguments 2D bb
  24. sub bb {
  25. my $self = shift;
  26. my $extents = $self->extents;
  27. return [ $extents->[X][MIN], $extents->[Y][MIN], $extents->[X][MAX], $extents->[Y][MAX] ];
  28. }
  29. sub polygon {
  30. my $self = shift;
  31. return Slic3r::Polygon->new_from_bounding_box($self->bb);
  32. }
  33. # note to $self
  34. sub rotate {
  35. die "Rotating an axis-aligned bounding box doesn't make any sense";
  36. }
  37. sub scale {
  38. my $self = shift;
  39. my ($factor) = @_;
  40. for (@{$self->extents}) {
  41. $_ *= $factor for @$_[MIN,MAX];
  42. }
  43. $self;
  44. }
  45. sub size {
  46. my $self = shift;
  47. my $extents = $self->extents;
  48. return [ map $extents->[$_][MAX] - $extents->[$_][MIN], grep $extents->[$_], (X,Y,Z) ];
  49. }
  50. sub center {
  51. my $self = shift;
  52. my $extents = $self->extents;
  53. return [ map +($extents->[$_][MAX] + $extents->[$_][MIN])/2, grep $extents->[$_], (X,Y,Z) ];
  54. }
  55. sub center_2D {
  56. my $self = shift;
  57. return Slic3r::Point->new(@{$self->center}[X,Y]);
  58. }
  59. sub min_point {
  60. my $self = shift;
  61. return Slic3r::Point->new($self->extents->[X][MIN], $self->extents->[Y][MIN]);
  62. }
  63. sub max_point {
  64. my $self = shift;
  65. return Slic3r::Point->new($self->extents->[X][MAX], $self->extents->[Y][MAX]);
  66. }
  67. 1;