mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 20:51:12 -06:00 
			
		
		
		
	Speed optimization in avoid_crossing_perimeters
This commit is contained in:
		
							parent
							
								
									f599ed00c6
								
							
						
					
					
						commit
						7180e7cb30
					
				
					 2 changed files with 4 additions and 8 deletions
				
			
		|  | @ -75,6 +75,7 @@ sub BUILD { | |||
|      | ||||
|     { | ||||
|         my @outer = (map @$_, @{$self->_outer}); | ||||
|         my @outer_ex = map [$_], @outer;  # as ExPolygons | ||||
|          | ||||
|         # lines of outer polygons connect visible points | ||||
|         for my $i (0 .. $#outer) { | ||||
|  | @ -91,7 +92,7 @@ sub BUILD { | |||
|                 for my $m (0 .. $#{$outer[$i]}) { | ||||
|                     for my $n (0 .. $#{$outer[$j]}) { | ||||
|                         my $line = Slic3r::Line->new($outer[$i][$m], $outer[$j][$n]); | ||||
|                         if (!first { $_->intersects_line($line) } @outer) { | ||||
|                         if (!@{Boost::Geometry::Utils::multi_polygon_multi_linestring_intersection(\@outer_ex, [$line])}) { | ||||
|                             # this line does not cross any polygon | ||||
|                             my $dist = $line->length; | ||||
|                             $edges->{$outer[$i][$m]}{$outer[$j][$n]} = $dist; | ||||
|  | @ -106,12 +107,13 @@ sub BUILD { | |||
|     # lines connecting inner polygons contours are visible but discouraged | ||||
|     if (!$self->no_internal) { | ||||
|         my @inner = (map $_->contour, map @$_, @{$self->_inner}); | ||||
|         my @inner_ex = map [$_], @inner;  # as ExPolygons | ||||
|         for my $i (0 .. $#inner) { | ||||
|             for my $j (($i+1) .. $#inner) { | ||||
|                 for my $m (0 .. $#{$inner[$i]}) { | ||||
|                     for my $n (0 .. $#{$inner[$j]}) { | ||||
|                         my $line = Slic3r::Line->new($inner[$i][$m], $inner[$j][$n]); | ||||
|                         if (!first { $_->intersects_line($line) } @inner) { | ||||
|                         if (!@{Boost::Geometry::Utils::multi_polygon_multi_linestring_intersection(\@inner_ex, [$line])}) { | ||||
|                             # this line does not cross any polygon | ||||
|                             my $dist = $line->length * CROSSING_FACTOR; | ||||
|                             $edges->{$inner[$i][$m]}{$inner[$j][$n]} = $dist; | ||||
|  |  | |||
|  | @ -172,10 +172,4 @@ sub split_at_first_point { | |||
|     return $self->split_at_index(0); | ||||
| } | ||||
| 
 | ||||
| sub intersects_line { | ||||
|     my $self = shift; | ||||
|     my ($line) = @_; | ||||
|     return @{Boost::Geometry::Utils::polygon_multi_linestring_intersection([$self], [$line])} > 0; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci