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; } }
//----------------------------------------------------------------------- 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; }
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; }
//----------------------------------------------------------------------- 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; }
void Set<ElemType>::intersect(Set & otherSet) { if (cmpFn != otherSet.cmpFn) { Error("intersect: sets have different comparison functions"); } intersectWith(otherSet); }