CCircle CMinSquareRecognizing::getCircleByPoints( std::vector<cv::Point> points ) { Eigen::MatrixXd C( 4, 4 ); C.fill( 0 ); C( 0, 0 ) = 4.; Eigen::MatrixXd S = generateScatterMatrix( points ); Eigen::MatrixXd InverseS = S.inverse(); Eigen::MatrixXd engineM = InverseS * C; Eigen::EigenSolver<Eigen::MatrixXd> es( engineM, true ); Eigen::MatrixXd vecs = es.eigenvectors().real(); Eigen::MatrixXd vals = es.eigenvalues().real(); for( int i = 0; i < vecs.rows(); ++i ) { Eigen::MatrixXd row = vecs.row( i ); Eigen::MatrixXd rowTranspose = row.transpose(); double tmp = ( row * S * rowTranspose )( 0, 0 ); if( ( 1. / vals( i, 0 ) ) > 0 && !isAbsInf( 1. / vals( i, 0 ) ) && !isAbsInf( vals( i, 0 ) ) && tmp > 0 ) { //нормируем коэффициент перед квадратами до 1 double a = vecs( 0, i ); double b = vecs( 1, i ) / a; double c = vecs( 2, i ) / a; double d = vecs( 3, i ) / a; double x = -b / 2.; double y = -c / 2.; double r = sqrt( b * b + c * c - 4 * d ) / 2.; double accuracy = countCircleAccuracy( x, y, r, points ); return CCircle( cvRound( x ), cvRound( y ), cvRound( r ), accuracy ); } } return CCircle( 0, 0, 0 ); }
void AddCircle(const std::vector<std::string> & inputParts, std::vector<std::shared_ptr<CShape>> & figures, std::vector<std::shared_ptr<sf::Shape>> & shapes) { CPoint pos = CPoint(std::stod(inputParts[1]), std::stod(inputParts[2])); double radius = std::stod(inputParts[3]); std::string outlineColor = inputParts[4]; std::string fillColor = inputParts[5]; CCircle circle = CCircle(pos, radius, fillColor, outlineColor); sf::CircleShape drawCircle; drawCircle.setPosition((float)pos.GetPosition().first, (float)pos.GetPosition().second); drawCircle.setRadius((float)radius); drawCircle.setFillColor(ConvertHexToRgb(fillColor)); drawCircle.setOutlineThickness(3.f); drawCircle.setOutlineColor(ConvertHexToRgb(outlineColor)); figures.push_back(std::make_shared<CCircle>(circle)); shapes.push_back(std::make_shared<sf::CircleShape>(drawCircle)); }
void ClockWidget::paintEvent(QPaintEvent *) { QColor CBackground( palette().window().color()); QColor CCircle( palette().windowText().color()); QColor CHMarkers( Qt::red);//palette().dark().color()); QColor CMMarkers( palette().dark().color()); QColor CHHand( 128,0,128);//palette().dark().color()); QColor CMHand( 0,128,128);//palette().mid().color()); QColor CSHand( 128,128,0);//palette().shadow().color()); QColor CText( palette().text().color()); QPointF center((width())/2.0f, (height())/2.0f); float clockSize = height() > width() ? width()-3 : height()-3; if (clockSize <= 0) return; QPainter painter(this); QPen pen; QFont font("Helvetica"); painter.setBackground(QBrush(CBackground)); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::HighQualityAntialiasing); painter.translate(center); if (systime) targetTime = QDateTime::currentDateTime(); dateTime = dateTime.addSecs(qRound(dateTime.secsTo(targetTime) * 0.5)); dateTime = dateTime.addMSecs(qRound(dateTime.msecsTo(targetTime) * 0.5)); QTime time = dateTime.time(); pen.setCapStyle(Qt::FlatCap); painter.setPen(Qt::NoPen); painter.setBrush(CBackground); painter.drawEllipse(QPointF(),clockSize * 0.485f, clockSize * 0.485f); painter.setBrush(Qt::NoBrush); painter.save(); pen.setColor(CMMarkers); pen.setWidthF(clockSize*0.01); painter.setPen(pen); for (int i = 0; i < 60; i++) { painter.drawLine(QPointF(0, clockSize * 0.46f),QPoint(0, clockSize * 0.485f)); painter.rotate(360/60); } painter.restore(); painter.save(); pen.setColor(CHMarkers); pen.setWidthF(clockSize*0.02); painter.setPen(pen); for (int i = 0; i < 12; i++) { painter.drawLine(QPointF(0, clockSize * 0.44f),QPoint(0, clockSize * 0.485f)); painter.rotate(360/12); } painter.restore(); pen.setColor(CCircle); pen.setWidthF(clockSize*0.01); painter.setPen(pen); painter.drawEllipse(QPointF(),clockSize * 0.485f, clockSize * 0.485f); pen.setColor(CText); painter.setPen(pen); QString weekday = ""; switch (dateTime.date().dayOfWeek()) { case 1: weekday = "Monday"; break; case 2: weekday = "Tuesday"; break; case 3: weekday = "Wednesday"; break; case 4: weekday = "Thursday"; break; case 5: weekday = "Friday"; break; case 6: weekday = "Saturday"; break; case 7: weekday = "Sunday"; break; default: break; } font.setPointSizeF(clockSize * 0.05f); painter.setFont(font); painter.drawText( -clockSize*0.35f, -clockSize*0.3f, clockSize*0.35f, clockSize*0.1f, Qt::AlignCenter, weekday); font.setPointSizeF(clockSize * 0.15f); painter.setFont(font); painter.drawText( -clockSize*0.3f, -clockSize*0.2f, clockSize*0.25f, clockSize*0.25f, Qt::AlignCenter, QString::number(dateTime.date().day())); painter.drawText( clockSize*0.05f, -clockSize*0.2f, clockSize*0.25f, clockSize*0.25f, Qt::AlignCenter, QString::number(dateTime.date().month())); font.setPointSizeF(clockSize * 0.10f); painter.setFont(font); painter.drawText( -clockSize*0.3f, clockSize*0.05f, clockSize*0.6f, clockSize*0.25f, Qt::AlignCenter, QString::number(dateTime.date().year())); painter.setPen(Qt::NoPen); const QPoint hourHand[4] = { QPoint(0,clockSize*0.035f), QPoint(-1-clockSize*0.035f,0), QPoint(0,-clockSize*0.25f), QPoint(1+clockSize*0.035f,0) }; painter.save(); painter.setBrush(CHHand); painter.rotate((time.hour() + time.minute()/60.0f) * (360/12)); painter.drawConvexPolygon(hourHand, 4); painter.drawPie(-clockSize*0.035f, -clockSize*0.035f, clockSize*0.07f, clockSize*0.07f, 180*16, 180*16 ); painter.restore(); const QPoint minuteHand[4] = { QPoint(0,clockSize*0.03f), QPoint(-1-clockSize*0.03f,0), QPoint(0,-clockSize*0.35f), QPoint(1+clockSize*0.03f,0) }; painter.save(); painter.setBrush(CMHand); painter.rotate((time.minute() + time.second()/60.0f) * (360/60)); painter.drawConvexPolygon(minuteHand, 4); painter.drawPie(-clockSize*0.03f, -clockSize*0.03f, clockSize*0.06f, clockSize*0.06f, 180*16, 180*16 ); painter.restore(); const QPoint secondHand[4] = { QPoint(0,clockSize*0.02f), QPoint(-1-clockSize*0.02f,0), QPoint(0,-clockSize*0.40f), QPoint(1+clockSize*0.02f,0) }; painter.save(); painter.setBrush(CSHand); painter.rotate((time.second() + time.msec()/1000.0f) * (360/60)); painter.drawConvexPolygon(secondHand, 4); painter.drawPie(-clockSize*0.02f, -clockSize*0.02f, clockSize*0.04f, clockSize*0.04f, 180*16, 180*16 ); painter.restore(); }