Exemplo n.º 1
0
void QwtRect::clipEdge(Edge edge, 
    const QwtPointArray &pa, QwtPointArray &cpa) const
{
    if ( pa.count() == 0 )
    {
        cpa.resize(0);
        return;
    }

    unsigned int count = 0;

    QPoint p1 = pa.point(0);
    if ( insideEdge(p1, edge) )
        addPoint(cpa, count++, p1);

    const uint nPoints = pa.size();
    for ( uint i = 1; i < nPoints; i++ )
    {
        const QPoint p2 = pa.point(i);
        if ( insideEdge(p2, edge) )
        {
            if ( insideEdge(p1, edge) )
                addPoint(cpa, count++, p2);
            else
            {
                addPoint(cpa, count++, intersectEdge(p1, p2, edge));
                addPoint(cpa, count++, p2);
            }
        }
        else
        {
            if ( insideEdge(p1, edge) )
                addPoint(cpa, count++, intersectEdge(p1, p2, edge));
        }
        p1 = p2;
    }
    cpa.resize(count);
}
Exemplo n.º 2
0
void QwtPolygonClipperF::clipEdge(Edge edge, 
    const QwtPolygonF &pa, QwtPolygonF &cpa) const
{
    if ( pa.count() == 0 )
    {
        cpa.resize(0);
        return;
    }

    unsigned int count = 0;

    QwtDoublePoint p1 = pa[0];
    if ( insideEdge(p1, edge) )
        addPoint(cpa, count++, p1);

    const uint nPoints = pa.size();
    for ( uint i = 1; i < nPoints; i++ )
    {
        const QwtDoublePoint p2 = pa[(int)i];
        if ( insideEdge(p2, edge) )
        {
            if ( insideEdge(p1, edge) )
                addPoint(cpa, count++, p2);
            else
            {
                addPoint(cpa, count++, intersectEdge(p1, p2, edge));
                addPoint(cpa, count++, p2);
            }
        }
        else
        {
            if ( insideEdge(p1, edge) )
                addPoint(cpa, count++, intersectEdge(p1, p2, edge));
        }
        p1 = p2;
    }
    cpa.resize(count);
}
Exemplo n.º 3
0
short PointInPolygon::rotationIndex( const Point2D& p )
{
    _testPoint = p;
    double a = 0.0;
    for (int i = 0; i < _numberPoints; i++)
    {
        int next = (i + 1) % _numberPoints;
        if (intersectEdge( _polygon[i], _polygon[next] ))
        {
            return 0;
        }
        a += angle( _polygon[i], p, _polygon[next] );
    }
    if (equal( a, 0.0 ))
        return 1;
    return -1;
}
Exemplo n.º 4
0
short PointInPolygon::rayCrossings( const Point2D& p )
{
    _testPoint = p;
    int cross = 0;
    for (int i = 0; i < _numberPoints; i++)
    {
        int next = (i + 1) % _numberPoints;
        if (!equal( _polygon[i].y, _polygon[next].y, Point2D::eps ))
        {
            Point2D intersection;
            if (computeIntersectionRay( _polygon[i], _polygon[next], intersection ))
            {
                if (equal( _testPoint.x, intersection.x, Point2D::eps ))
                {
                    return 0;
                }
                else
                {
                    if (intersection.x > _testPoint.x && intersection.y > std::min( _polygon[i].y, _polygon[next].y ))
                    {
                        cross++;
                    }
                }
            }
        }
        else
        {
            if (intersectEdge( _polygon[i], _polygon[next] ))
            {
                return 0;
            }
        }
    }
    if (cross % 2 == 1)
    {
        return -1;
    }
    return 1;
}