mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Patch for --gcode-arcs (kindly submitted by Paul Howes)
This commit is contained in:
		
							parent
							
								
									ca44cba6c3
								
							
						
					
					
						commit
						f659dcf088
					
				
					 1 changed files with 13 additions and 4 deletions
				
			
		| 
						 | 
					@ -187,10 +187,14 @@ sub detect_arcs {
 | 
				
			||||||
            my $s2_angle = $s2->atan;
 | 
					            my $s2_angle = $s2->atan;
 | 
				
			||||||
            my $s3_angle = $s3->atan;
 | 
					            my $s3_angle = $s3->atan;
 | 
				
			||||||
            $s1_angle += 2*PI if $s1_angle < 0;
 | 
					            $s1_angle += 2*PI if $s1_angle < 0;
 | 
				
			||||||
            $s2_angle += 2*PI if $s2_angle < 0;
 | 
					 | 
				
			||||||
            $s3_angle += 2*PI if $s3_angle < 0;
 | 
					 | 
				
			||||||
            my $s1s2_angle = $s2_angle - $s1_angle;
 | 
					            my $s1s2_angle = $s2_angle - $s1_angle;
 | 
				
			||||||
            my $s2s3_angle = $s3_angle - $s2_angle;
 | 
					            my $s2s3_angle = $s3_angle - $s2_angle;
 | 
				
			||||||
 | 
					            # allow -ve angles but constrain angles differences to 0<difference<2PI
 | 
				
			||||||
 | 
					            $s1s2_angle -= 2*PI if ($s1s2_angle > 2*PI);
 | 
				
			||||||
 | 
					            $s1s2_angle += 2*PI if ($s1s2_angle < -2*PI);
 | 
				
			||||||
 | 
					            $s2s3_angle -= 2*PI if ($s2s3_angle > 2*PI);
 | 
				
			||||||
 | 
					            $s2s3_angle += 2*PI if ($s2s3_angle < -2*PI);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            next if abs($s1s2_angle - $s2s3_angle) > $Slic3r::Geometry::parallel_degrees_limit;
 | 
					            next if abs($s1s2_angle - $s2s3_angle) > $Slic3r::Geometry::parallel_degrees_limit;
 | 
				
			||||||
            next if abs($s1s2_angle) < $Slic3r::Geometry::parallel_degrees_limit;     # ignore parallel lines
 | 
					            next if abs($s1s2_angle) < $Slic3r::Geometry::parallel_degrees_limit;     # ignore parallel lines
 | 
				
			||||||
            next if $s1s2_angle > $max_angle;  # ignore too sharp vertices
 | 
					            next if $s1s2_angle > $max_angle;  # ignore too sharp vertices
 | 
				
			||||||
| 
						 | 
					@ -203,10 +207,15 @@ sub detect_arcs {
 | 
				
			||||||
                my $line = Slic3r::Line->new($points[$j], $points[$j+1]);
 | 
					                my $line = Slic3r::Line->new($points[$j], $points[$j+1]);
 | 
				
			||||||
                last if abs($line->length - $s1_len) > $len_epsilon;
 | 
					                last if abs($line->length - $s1_len) > $len_epsilon;
 | 
				
			||||||
                my $line_angle = $line->atan;
 | 
					                my $line_angle = $line->atan;
 | 
				
			||||||
                $line_angle += 2*PI if $line_angle < 0;
 | 
					 | 
				
			||||||
                my $anglediff = $line_angle - $last_line_angle;
 | 
					                my $anglediff = $line_angle - $last_line_angle;
 | 
				
			||||||
                last if abs($s1s2_angle - $anglediff) > $Slic3r::Geometry::parallel_degrees_limit;
 | 
					                # allow -ve angles but constrain angle differences to 0<difference<2PI
 | 
				
			||||||
 | 
					                $anglediff -= 2*PI if ($anglediff > 2*PI);
 | 
				
			||||||
 | 
					                $anglediff += 2*PI if ($anglediff < -2*PI);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                last if abs($s1s2_angle - $anglediff) > $Slic3r::Geometry::parallel_degrees_limit;
 | 
				
			||||||
 | 
					                # Do not try to be too ambitious. Just detect arcs up to 60 degrees.
 | 
				
			||||||
 | 
					                # The algorithm for finding the center is not accurate enough for more than this
 | 
				
			||||||
 | 
					                last if abs($s1_angle - $line_angle) > PI/6; 
 | 
				
			||||||
                # point $j+1 belongs to the arc
 | 
					                # point $j+1 belongs to the arc
 | 
				
			||||||
                $arc_points[-1] = $points[$j+1];
 | 
					                $arc_points[-1] = $points[$j+1];
 | 
				
			||||||
                $last_j = $j+1;
 | 
					                $last_j = $j+1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue