mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Bugfix: when the Voronoi diagram contained very large coordinates we need to check whether they are greater than our allowed range and consider the Voronoi edges infinite in those cases, in order to prevent overflows.
https://github.com/alexrj/Slic3r/issues/3776
9ad1360e44
			
			
This commit is contained in:
		
							parent
							
								
									6162670bbd
								
							
						
					
					
						commit
						0dae43e4bc
					
				
					 3 changed files with 17 additions and 9 deletions
				
			
		|  | @ -9,15 +9,6 @@ | |||
| 
 | ||||
| #include <Shiny/Shiny.h> | ||||
| 
 | ||||
| // Factor to convert from coord_t (which is int32) to an int64 type used by the Clipper library
 | ||||
| // for general offsetting (the offset(), offset2(), offset_ex() functions) and for the safety offset,
 | ||||
| // which is optionally executed by other functions (union, intersection, diff).
 | ||||
| // By the way, is the scalling for offset needed at all?
 | ||||
| #define CLIPPER_OFFSET_POWER_OF_2 17 | ||||
| // 2^17=131072
 | ||||
| #define CLIPPER_OFFSET_SCALE (1 << CLIPPER_OFFSET_POWER_OF_2) | ||||
| #define CLIPPER_OFFSET_SCALE_ROUNDING_DELTA ((1 << (CLIPPER_OFFSET_POWER_OF_2 - 1)) - 1) | ||||
| 
 | ||||
| namespace Slic3r { | ||||
| 
 | ||||
| #ifdef CLIPPER_UTILS_DEBUG | ||||
|  |  | |||
|  | @ -12,6 +12,16 @@ using ClipperLib::jtMiter; | |||
| using ClipperLib::jtRound; | ||||
| using ClipperLib::jtSquare; | ||||
| 
 | ||||
| // Factor to convert from coord_t (which is int32) to an int64 type used by the Clipper library
 | ||||
| // for general offsetting (the offset(), offset2(), offset_ex() functions) and for the safety offset,
 | ||||
| // which is optionally executed by other functions (union, intersection, diff).
 | ||||
| // By the way, is the scalling for offset needed at all?
 | ||||
| #define CLIPPER_OFFSET_POWER_OF_2 17 | ||||
| // 2^17=131072
 | ||||
| #define CLIPPER_OFFSET_SCALE (1 << CLIPPER_OFFSET_POWER_OF_2) | ||||
| #define CLIPPER_OFFSET_SCALE_ROUNDING_DELTA ((1 << (CLIPPER_OFFSET_POWER_OF_2 - 1)) - 1) | ||||
| #define CLIPPER_MAX_COORD_UNSCALED (ClipperLib::hiRange / CLIPPER_OFFSET_SCALE) | ||||
| 
 | ||||
| namespace Slic3r { | ||||
| 
 | ||||
| //-----------------------------------------------------------
 | ||||
|  |  | |||
|  | @ -983,6 +983,13 @@ MedialAxis::process_edge_neighbors(const VD::edge_type* edge, ThickPolyline* pol | |||
| bool | ||||
| MedialAxis::validate_edge(const VD::edge_type* edge) | ||||
| { | ||||
|     // prevent overflows and detect almost-infinite edges
 | ||||
|     if (std::abs(edge->vertex0()->x()) > double(CLIPPER_MAX_COORD_UNSCALED) ||  | ||||
|         std::abs(edge->vertex0()->y()) > double(CLIPPER_MAX_COORD_UNSCALED) ||  | ||||
|         std::abs(edge->vertex1()->x()) > double(CLIPPER_MAX_COORD_UNSCALED) || | ||||
|         std::abs(edge->vertex1()->y()) > double(CLIPPER_MAX_COORD_UNSCALED)) | ||||
|         return false; | ||||
| 
 | ||||
|     // construct the line representing this edge of the Voronoi diagram
 | ||||
|     const Line line( | ||||
|         Point( edge->vertex0()->x(), edge->vertex0()->y() ), | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv