void MgEllipse::_update() { __super::_update(); mgEllipseToBezier(_bzpts, getCenter(), getWidth() / 2, getHeight() / 2); Matrix2d mat(Matrix2d::rotation(getAngle(), getCenter())); for (int i = 0; i < 13; i++) _bzpts[i] *= mat; mgBeziersBox(_extent, 13, _bzpts, true); }
bool GiGraphics::drawEllipse(const GiContext* ctx, const Point2d& center, float rx, float ry, bool modelUnit) { if (m_impl->drawRefcnt == 0 || rx < _MGZERO) return false; GiLock lock (&m_impl->drawRefcnt); bool ret = false; Matrix2d matD(S2D(xf(), modelUnit)); if (ry < _MGZERO) ry = rx; const Box2d extent (center, rx*2.f, ry*2.f); // 模型坐标范围 if (!DRAW_RECT(m_impl, modelUnit).isIntersect(extent)) // 全部在显示区域外 return false; if (mgIsZero(matD.m12) && mgIsZero(matD.m21)) { Point2d cen (center * matD); rx *= matD.m11; ry *= matD.m22; ret = rawEllipse(ctx, cen.x - rx, cen.y - ry, 2 * rx, 2 * ry); } else { Point2d points[13]; mgEllipseToBezier(points, center, rx, ry); matD.TransformPoints(13, points); ret = rawBeginPath(); if (ret) { ret = rawMoveTo(points[0].x, points[0].y); ret = rawBezierTo(points + 1, 12); ret = rawClosePath(); ret = rawEndPath(ctx, true); } } return ret; }