32 wxASSERT( aSegments.size() >= 3 );
35 unsigned int j = aSegments.size() - 1;
36 bool oddNodes =
false;
38 for( i = 0; i < aSegments.size(); j = i++ )
40 const float polyJY = aSegments[j].m_Start.y;
41 const float polyIY = aSegments[i].m_Start.y;
43 if( ( ( polyIY <= aPoint.y ) && ( polyJY >= aPoint.y ) )
44 || ( ( polyJY <= aPoint.y ) && ( polyIY >= aPoint.y ) ) )
46 const float polyJX = aSegments[j].m_Start.x;
47 const float polyIX = aSegments[i].m_Start.x;
49 if( ( polyIX <= aPoint.x ) || ( polyJX <= aPoint.x ) )
50 oddNodes ^= ( ( polyIX + ( ( aPoint.y - polyIY ) * aSegments[i].m_inv_JY_minus_IY )
51 * aSegments[i].m_JX_minus_IX )
375 float aBiuTo3dUnitsScale,
float aDivFactor,
376 const BOARD_ITEM& aBoardItem,
int aPolyIndex )
395 segments_and_normals.reserve(
path.PointCount() );
396 segments.reserve(
path.PointCount() );
400 for(
int i = 0; i <
path.PointCount(); i++ )
404 const SFVEC2F point( (
float) ( a.
x ) * aBiuTo3dUnitsScale,
405 (
float) ( -a.
y ) * aBiuTo3dUnitsScale );
408 if( ( i == 0 ) || ( fabs( prevPoint.x - point.x ) > FLT_EPSILON )
409 || ( fabs( prevPoint.y - point.y ) > FLT_EPSILON ) )
417 segments_and_normals.push_back( sn );
421 segments.push_back( ps );
429 unsigned int j = segments_and_normals.size() - 1;
432 std::vector<SFVEC2F> tmpSegmentNormals;
433 tmpSegmentNormals.resize( segments_and_normals.size() );
435 float medOfTheSquaresSegmentLength = 0.0f;
437#ifdef PRINT_STATISTICS_3D_VIEWER
438 float minLength = FLT_MAX;
441 for( i = 0; i < segments_and_normals.size(); j = i++ )
443 const SFVEC2F slope = segments_and_normals[j].m_Start - segments_and_normals[i].m_Start;
445 segments_and_normals[i].m_Precalc_slope = slope;
448 segments[i].m_inv_JY_minus_IY =
449 1.0f / ( segments_and_normals[j].m_Start.y - segments_and_normals[i].m_Start.y );
451 segments[i].m_JX_minus_IX =
452 ( segments_and_normals[j].m_Start.x - segments_and_normals[i].m_Start.x );
456 tmpSegmentNormals[i] = glm::normalize(
SFVEC2F( slope.y, -slope.x ) );
458 const float length = slope.x * slope.x + slope.y * slope.y;
460#ifdef PRINT_STATISTICS_3D_VIEWER
461 if( length < minLength )
465 medOfTheSquaresSegmentLength += length;
468#ifdef PRINT_STATISTICS_3D_VIEWER
469 float minSegmentLength = sqrt( minLength );
474 medOfTheSquaresSegmentLength /= segments_and_normals.size();
475 medOfTheSquaresSegmentLength = sqrt( medOfTheSquaresSegmentLength );
481 j = segments_and_normals.size() - 1;
483 for( i = 0; i < segments_and_normals.size(); j = i++ )
485 const SFVEC2F normalBeforeSeg = tmpSegmentNormals[j];
486 const SFVEC2F normalSeg = tmpSegmentNormals[i];
487 const SFVEC2F normalAfterSeg = tmpSegmentNormals[( i + 1 ) % segments_and_normals.size()];
489 const float dotBefore = glm::dot( normalBeforeSeg, normalSeg );
490 const float dotAfter = glm::dot( normalAfterSeg, normalSeg );
492 if( dotBefore < 0.7f )
493 segments_and_normals[i].m_Normals.m_Start = normalSeg;
495 segments_and_normals[i].m_Normals.m_Start =
496 glm::normalize( ( normalBeforeSeg * dotBefore ) + normalSeg );
498 if( dotAfter < 0.7f )
499 segments_and_normals[i].m_Normals.m_End = normalSeg;
501 segments_and_normals[i].m_Normals.m_End =
502 glm::normalize( ( normalAfterSeg * dotAfter ) + normalSeg );
507 if( aDivFactor < 0.0f )
513 if( aDivFactor <= FLT_EPSILON )
514 aDivFactor = medOfTheSquaresSegmentLength;
516 grid_divisions.x = (
unsigned int) ( ( bbox.
GetExtent().x / aDivFactor ) );
517 grid_divisions.y = (
unsigned int) ( ( bbox.
GetExtent().y / aDivFactor ) );
519 grid_divisions = glm::clamp(
526 blockAdvance.x = bbox.
GetExtent().x / (float) grid_divisions.x;
527 blockAdvance.y = bbox.
GetExtent().y / (float) grid_divisions.y;
529 wxASSERT( blockAdvance.x > 0.0f );
530 wxASSERT( blockAdvance.y > 0.0f );
532 const int leftToRight_inc = ( pathBounds.
GetRight() - pathBounds.
GetLeft() ) / grid_divisions.x;
534 const int topToBottom_inc = ( pathBounds.
GetBottom() - pathBounds.
GetTop() ) / grid_divisions.y;
537 unsigned int stats_n_empty_blocks = 0;
538 unsigned int stats_n_dummy_blocks = 0;
539 unsigned int stats_n_poly_blocks = 0;
540 unsigned int stats_sum_size_of_polygons = 0;
543 int topToBottom = pathBounds.
GetTop();
544 float blockY = bbox.
Max().y;
546 for(
unsigned int iy = 0; iy < grid_divisions.y; iy++ )
548 int leftToRight = pathBounds.
GetLeft();
549 float blockX = bbox.
Min().x;
551 for(
unsigned int ix = 0; ix < grid_divisions.x; ix++ )
554 SFVEC2F( blockX + blockAdvance.x, blockY ) );
565 if( extractedSegments.empty() )
582 stats_n_dummy_blocks++;
588 stats_n_empty_blocks++;
602 VECTOR2I( leftToRight + leftToRight_inc, topToBottom ),
603 VECTOR2I( leftToRight + leftToRight_inc, topToBottom + topToBottom_inc ),
604 VECTOR2I( leftToRight, topToBottom + topToBottom_inc ) } );
617 outersAndHoles.
m_Holes.clear();
620 for(
int idx = 0; idx < solution.
OutlineCount(); idx++ )
627 outersAndHoles.
m_Outers.push_back( solutionSegment );
629 stats_sum_size_of_polygons += solutionSegment.size();
631 for(
int holeIdx = 0; holeIdx < solution.
HoleCount( idx ); holeIdx++ )
636 outersAndHoles.
m_Holes.push_back( solutionSegment );
637 stats_sum_size_of_polygons += solutionSegment.size();
641 if( !outersAndHoles.
m_Outers.empty() )
643 aDstContainer.
Add(
new POLYGON_2D( extractedSegments, outersAndHoles,
645 stats_n_poly_blocks++;
649 blockX += blockAdvance.x;
650 leftToRight += leftToRight_inc;
653 blockY -= blockAdvance.y;
654 topToBottom += topToBottom_inc;