コード例 #1
0
ファイル: GrClip.cpp プロジェクト: ghub/NVprSDK
void GrClip::setFromIterator(GrClipIterator* iter, GrScalar tx, GrScalar ty,
                             const GrRect* conservativeBounds) {
    fList.reset();

    int rectCount = 0;

    // compute bounds for common case of series of intersecting rects.
    bool isectRectValid = true;

    if (iter) {
        for (iter->rewind(); !iter->isDone(); iter->next()) {
            Element& e = fList.push_back();
            e.fType = iter->getType();
            e.fOp = iter->getOp();
            // iterators should not emit replace
            GrAssert(kReplace_SetOp != e.fOp);
            switch (e.fType) {
                case kRect_ClipType:
                    iter->getRect(&e.fRect);
                    if (tx || ty) {
                        e.fRect.offset(tx, ty);
                    }
                    ++rectCount;
                    if (isectRectValid) {
                        if (kIntersect_SetOp == e.fOp) {
                            GrAssert(fList.count() <= 2);
                            if (fList.count() > 1) {
                                GrAssert(2 == rectCount);
                                rectCount = 1;
                                fList.pop_back();
                                GrAssert(kRect_ClipType == fList.back().fType);
                                intersectWith(&fList.back().fRect, e.fRect);
                            }
                        } else {
                            isectRectValid = false;
                        }
                    }
                    break;
                case kPath_ClipType:
                    e.fPath = *iter->getPath();
                    if (tx || ty) {
                        e.fPath.offset(tx, ty);
                    }
                    e.fPathFill = iter->getPathFill();
                    isectRectValid = false;
                    break;
                default:
                    GrCrash("Unknown clip element type.");
            }
        }
    }
    fConservativeBoundsValid = false;
    if (isectRectValid && rectCount) {
        fConservativeBounds = fList[0].fRect;
        fConservativeBoundsValid = true;
    } else if (NULL != conservativeBounds) {
        fConservativeBounds = *conservativeBounds;
        fConservativeBoundsValid = true;
    }
}
コード例 #2
0
ファイル: UtilFunc.cpp プロジェクト: gitrider/wxsj2
    //-----------------------------------------------------------------------
    bool edgeInGrid(const Vector2& p1, const Vector2& p2, const Grid& grid)
    {
        Vector2 gridPoint1, gridPoint2, gridPoint3, gridPoint4;
        gridPoint1 = grid.mMinPos;
        gridPoint2 = grid.mMaxPos;
        gridPoint3.x = grid.mMinPos.x;
        gridPoint3.y = grid.mMaxPos.y;
        gridPoint4.x = grid.mMaxPos.x;
        gridPoint4.y = grid.mMinPos.y;

        float x,y;

        if (pointInGrid(p1, grid) || pointInGrid(p2, grid) ||
            intersectWith(p1, p2, gridPoint1, gridPoint3,x,y) ||
            intersectWith(p1, p2, gridPoint1, gridPoint4,x,y) ||
            intersectWith(p1, p2, gridPoint2, gridPoint4,x,y) ||
            intersectWith(p1, p2, gridPoint2, gridPoint3,x,y))
            return true;

        return false;
    }
コード例 #3
0
ファイル: Polygon.cpp プロジェクト: gitrider/wxsj2
    bool CPolygon::intersert(const Vector2& lineStart, const Vector2& lineEnd, Point2DList& pointList) const
    {
        bool intersected = false;
        for (EdgeIterator p1ei = mCGALPolygon.edges_begin(); p1ei != mCGALPolygon.edges_end(); ++p1ei)
        {
            Vector2 start1((*p1ei).source().x(), (*p1ei).source().y());
            Vector2 end1((*p1ei).target().x(), (*p1ei).target().y());

            float crossx, crossy;

            if ( intersectWith(start1, end1, lineStart, lineEnd, crossx, crossy) )
            {
                pointList.push_back(Vector2(crossx,crossy));

                intersected = true;
            }
        }

        return intersected;
    }
コード例 #4
0
ファイル: UtilFunc.cpp プロジェクト: gitrider/wxsj2
    //-----------------------------------------------------------------------
    bool intersectGridTriangle(const Grid& grid, const Triangle& triangle)
    {
        // 先检测包围盒
        if (grid.mMaxPos.x < triangle.minPos.x)
            return false;
        if (grid.mMaxPos.y < triangle.minPos.y)
            return false;

        if (grid.mMinPos.x > triangle.maxPos.x)
            return false;
        if (grid.mMinPos.y > triangle.maxPos.y)
            return false;

        Vector2 gridPoint1, gridPoint2, gridPoint3, gridPoint4;
        gridPoint1 = grid.mMinPos;
        gridPoint2 = grid.mMaxPos;
        gridPoint3.x = grid.mMinPos.x;
        gridPoint3.y = grid.mMaxPos.y;
        gridPoint4.x = grid.mMaxPos.x;
        gridPoint4.y = grid.mMinPos.y;

        float x,y;

        // 只要有一个相交,返回true
        if (intersectWith(triangle.pos1, triangle.pos2,gridPoint1,gridPoint3,x,y) ||
            intersectWith(triangle.pos1, triangle.pos2,gridPoint1,gridPoint4,x,y) ||
            intersectWith(triangle.pos1, triangle.pos2,gridPoint2,gridPoint4,x,y) ||
            intersectWith(triangle.pos1, triangle.pos2,gridPoint2,gridPoint3,x,y) ||

            intersectWith(triangle.pos3, triangle.pos2,gridPoint1,gridPoint3,x,y) ||
            intersectWith(triangle.pos3, triangle.pos2,gridPoint1,gridPoint4,x,y) ||
            intersectWith(triangle.pos3, triangle.pos2,gridPoint2,gridPoint4,x,y) ||
            intersectWith(triangle.pos3, triangle.pos2,gridPoint2,gridPoint3,x,y) ||
            
            intersectWith(triangle.pos1, triangle.pos3,gridPoint1,gridPoint3,x,y) ||
            intersectWith(triangle.pos1, triangle.pos3,gridPoint1,gridPoint4,x,y) ||
            intersectWith(triangle.pos1, triangle.pos3,gridPoint2,gridPoint4,x,y) ||
            intersectWith(triangle.pos1, triangle.pos3,gridPoint2,gridPoint3,x,y)
            )
            return true;

        // 都不相交,判断是否互相包含
        if ( ( Math::pointInTri2D(gridPoint1, triangle.pos1, triangle.pos2, triangle.pos3) &&
               Math::pointInTri2D(gridPoint2, triangle.pos1, triangle.pos2, triangle.pos3) &&
               Math::pointInTri2D(gridPoint3, triangle.pos1, triangle.pos2, triangle.pos3) &&
               Math::pointInTri2D(gridPoint4, triangle.pos1, triangle.pos2, triangle.pos3) ) ||

             ( pointInGrid(triangle.pos1, grid) &&
               pointInGrid(triangle.pos2, grid) &&
               pointInGrid(triangle.pos3, grid) )
            )
            return true;
        else
            return false;
    }
コード例 #5
0
ファイル: set.cpp プロジェクト: Nikvand/glass_bonus_challenge
void Set<ElemType>::intersect(Set & otherSet) {
	if (cmpFn != otherSet.cmpFn) {
		Error("intersect: sets have different comparison functions");
	}
	intersectWith(otherSet);
}