Ejemplo n.º 1
0
bool SC_PolyStore::PointInPoly(const Point2D& inPt,
                               int            polyNum) const
{
    SC_PointArray polyData;
    GetPolyPoints(polyNum, polyData);
    return polyData.PointInPoly(inPt);
}
Ejemplo n.º 2
0
bool SC_PolyStore::PointInPoly(const double& xPt,
                               const double& yPt,
                               int           polyNum) const
{
    SC_PointArray polyData;
    GetPolyPoints(polyNum, polyData);
    return polyData.PointInPoly(xPt, yPt);
}
Ejemplo n.º 3
0
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;
    }
}