void GradientTool::drawGradient(MouseState mouse, QImage *image, QColor from, QColor to) { QPainter painter(image); QPoint gradVec = mouse.getPos() - mouse.getClickedAt(); float length = std::sqrt(gradVec.x() * gradVec.x() + gradVec.y() * gradVec.y()); float vecX = gradVec.x() / length; float vecY = gradVec.y() / length; qsrand(0); for(int i(0); i < image->width(); ++i){ for(int j(0); j < image->height(); ++j){ QPoint point = QPoint(i, j) - mouse.getClickedAt(); float val = (float)(point.x() * vecX + point.y() * vecY) / length; val = std::min(1.f, std::max(0.f, val)); if(m_dithering->isChecked()){ painter.setPen(QPen(m_brushes[(int) round(val * std::pow(2, m_ditheringLevel->value() -1)) * std::pow(2, 5-m_ditheringLevel->value())], 1)); } else{ if(qrand() %128 < val *128) painter.setPen(QPen(to)); else painter.setPen(QPen(from)); } painter.drawPoint(i, j); } } }