WTransform WTransform::adjoint() const { return WTransform(m33() * m22() - m32() * m23(), - (m33() * m12() - m32() * m13()), - (m33() * m21() - m31() * m23()), m33() * m11() - m31() * m13(), m32() * m21() - m31() * m22(), - (m32() * m11() - m31() * m12())); }
WTransform& WTransform::rotateRadians(double angle) { double r11 = std::cos(angle); double r12 = -std::sin(angle); double r21 = -r12; double r22 = r11; // note: our public constructor is transposed! return *this *= WTransform(r11, r21, r12, r22, 0, 0); }
void WPainter::recalculateViewTransform() { viewTransform_ = WTransform(); double scaleX = viewPort_.width() / window_.width(); double scaleY = viewPort_.height() / window_.height(); viewTransform_.translate(viewPort_.x() - window_.x() * scaleX, viewPort_.y() - window_.y() * scaleY); viewTransform_.scale(scaleX, scaleY); if (device_) device_->setChanged(WPaintDevice::Transform); }
void WPainter::drawPie(const WRectF& rectangle, int startAngle, int spanAngle) { WTransform oldTransform = WTransform(worldTransform()); translate(rectangle.center().x(), rectangle.center().y()); scale(1., rectangle.height() / rectangle.width()); WPainterPath path(WPointF(0.0, 0.0)); path.arcTo(0.0, 0.0, rectangle.width() / 2.0, startAngle / 16., spanAngle / 16.); path.closeSubPath(); drawPath(path); setWorldTransform(oldTransform); }
WTransform WTransform::inverted() const { double det = determinant(); if (det != 0) { WTransform adj = adjoint(); return WTransform(adj.m11() / det, adj.m12() / det, adj.m21() / det, adj.m22() / det, adj.m31() / det, adj.m32() / det); } else { LOG_ERROR("inverted(): oops, determinant == 0"); return *this; } }
WTransform WTransform::adjoint() const { WTransform res = WTransform(m33() * m22() - m32() * m23(), - (m33() * m12() - m32() * m13()), - (m33() * m21() - m31() * m23()), m33() * m11() - m31() * m13(), m32() * m21() - m31() * m22(), - (m32() * m11() - m31() * m12())); if (isJavaScriptBound()) { res.assignBinding(*this, WT_CLASS ".gfxUtils.transform_adjoint(" + jsRef() + ")"); } return res; }
void WPainter::drawChord(const WRectF& rectangle, int startAngle, int spanAngle) { WTransform oldTransform = WTransform(worldTransform()); translate(rectangle.center().x(), rectangle.center().y()); scale(1., rectangle.height() / rectangle.width()); double start = startAngle / 16.; double span = spanAngle / 16.; WPainterPath path; path.arcMoveTo(0, 0, rectangle.width()/2., start); path.arcTo(0, 0, rectangle.width()/2., start, span); path.closeSubPath(); drawPath(path); setWorldTransform(oldTransform); }
WTransform& WTransform::translate(double dx, double dy) { return *this *= WTransform(1, 0, 0, 1, dx, dy); }
WTransform& WTransform::shear(double sh, double sv) { return *this *= WTransform(0, sv, sh, 0, 0, 0); }
WTransform& WTransform::scale(double sx, double sy) { return *this *= WTransform(sx, 0, 0, sy, 0, 0); }