bool SC_PolyStore::PointInPoly(const Point2D& inPt, int polyNum) const { SC_PointArray polyData; GetPolyPoints(polyNum, polyData); return polyData.PointInPoly(inPt); }
bool SC_PolyStore::PointInPoly(const double& xPt, const double& yPt, int polyNum) const { SC_PointArray polyData; GetPolyPoints(polyNum, polyData); return polyData.PointInPoly(xPt, yPt); }
void SC_PolyStore::SetPolyClockwise(int polyIndx) { if (polyN[polyIndx] < 3) return; SC_PointArray tempPoly; GetPolyPoints(polyIndx, tempPoly); if (tempPoly.CalcPolyArea() < 0.0) { int npoly = polyN[polyIndx]; SC_IntArray tempIndex; tempIndex.Alloc(npoly); int polyEnd = polyStart[polyIndx] + npoly - 1; int i; for (i = 0; i < npoly; i++) tempIndex[i] = polyPointIndx[polyEnd --]; for (i = 0; i < npoly; i++) polyPointIndx[polyStart[polyIndx] + i] = tempIndex[i]; } }
/** * Function TransformShapeWithClearanceToPolygon * Convert the track shape to a closed polygon * Used in filling zones calculations * Circles and arcs are approximated by segments * @param aCornerBuffer = a buffer to store the polygon * @param aClearanceValue = the clearance around the pad * @param aCircleToSegmentsCount = the number of segments to approximate a circle * @param aCorrectionFactor = the correction to apply to circles radius to keep * clearance when the circle is approxiamted by segment bigger or equal * to the real clearance value (usually near from 1.0) */ void DRAWSEGMENT::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer, int aClearanceValue, int aCircleToSegmentsCount, double aCorrectionFactor ) const { // The full width of the lines to create: int linewidth = m_Width + (2 * aClearanceValue); switch( m_Shape ) { case S_CIRCLE: TransformRingToPolygon( aCornerBuffer, GetCenter(), GetRadius(), aCircleToSegmentsCount, linewidth ) ; break; case S_ARC: TransformArcToPolygon( aCornerBuffer, GetCenter(), GetArcStart(), m_Angle, aCircleToSegmentsCount, linewidth ); break; case S_SEGMENT: TransformRoundedEndsSegmentToPolygon( aCornerBuffer, m_Start, m_End, aCircleToSegmentsCount, linewidth ); break; case S_POLYGON: if ( GetPolyPoints().size() < 2 ) break; // Malformed polygon. { // The polygon is expected to be a simple polygon // not self intersecting, no hole. MODULE* module = GetParentModule(); // NULL for items not in footprints double orientation = module ? module->GetOrientation() : 0.0; // Build the polygon with the actual position and orientation: std::vector< wxPoint> poly; poly = GetPolyPoints(); for( unsigned ii = 0; ii < poly.size(); ii++ ) { RotatePoint( &poly[ii], orientation ); poly[ii] += GetPosition(); } // Generate polygons for the outline + clearance // This code is compatible with a polygon with holes linked to external outline // by overlapping segments. // Insert the initial polygon: aCornerBuffer.NewOutline(); for( unsigned ii = 0; ii < poly.size(); ii++ ) aCornerBuffer.Append( poly[ii].x, poly[ii].y ); if( linewidth ) // Add thick outlines { CPolyPt corner1( poly[poly.size()-1] ); for( unsigned ii = 0; ii < poly.size(); ii++ ) { CPolyPt corner2( poly[ii] ); if( corner2 != corner1 ) { TransformRoundedEndsSegmentToPolygon( aCornerBuffer, corner1, corner2, aCircleToSegmentsCount, linewidth ); } corner1 = corner2; } } } break; case S_CURVE: // Bezier curve (TODO: not yet in use) break; default: break; } }