bool MgLine::_hitTestBox(const Box2d& rect) const { if (!__super::_hitTestBox(rect)) return false; Point2d pts[2] = { _points[0], _points[1] }; return mgClipLine(pts[0], pts[1], rect); }
bool GiGraphics::drawLine(const GiContext* ctx, const Point2d& startPt, const Point2d& endPt, bool modelUnit) { if (m_impl->drawRefcnt == 0) return false; GiLock lock (&m_impl->drawRefcnt); if (!DRAW_RECT(m_impl, modelUnit).isIntersect(Box2d(startPt, endPt))) return false; Point2d pts[2] = { startPt * S2D(xf(), modelUnit), endPt * S2D(xf(), modelUnit) }; if (!mgClipLine(pts[0], pts[1], m_impl->rectDraw)) return false; return rawLine(ctx, pts[0].x, pts[0].y, pts[1].x, pts[1].y); }
static bool DrawEdge(int count, int &i, Point2d* pts, Point2d &ptLast, const PolylineAux& aux, const Box2d& rectDraw) { int n, si, ei; Point2d pt1, pt2; pt1 = ptLast; ptLast = pts[i+1]; pt2 = ptLast; if (!mgClipLine(pt1, pt2, rectDraw)) // 该边不可见 return false; si = i; // 收集第一条可见边 ei = i+1; pts[i] = pt1; // 收集起点 if (pt2 != ptLast) // 如果该边终点不可见 { pts[i+1] = pt2; // 收集交点 } else // 否则继续收集后续点 { i++; // 下一边的起点可见,跳过 for (; i < count - 1; i++) // 依次处理后续可见边 { pt1 = ptLast; ptLast = pts[i+1]; pt2 = ptLast; if (!mgClipLine(pt1, pt2, rectDraw)) // 该边不可见 break; ei++; if (pt2 != ptLast) // 该边起点可见,终点不可见 { pts[i+1] = pt2; // 收集交点 break; } } } // 显示找到的多条线段 n = ei - si + 1; if (n > 1) { vector<Point2d> pxpoints; pxpoints.resize(n); Point2d* pxs = &pxpoints.front(); n = 0; for (int j = si; j <= ei; j++) { // 记下第一个点,其他点如果和上一点不重合则记下,否则跳过 if (j == si || fabs(pt1.x - pts[j].x) > 2 || fabs(pt1.y - pts[j].y) > 2) { pt1 = pts[j]; pxs[n++] = pt1; } } return aux.draw(pxs, n); } return false; }