#define _USE_MATH_DEFINES #include #include "varc.h" #include VArc::VArc (){ f1 = 0; f2 = 0; length = 0; radius = 0; center = 0; p1 = QPointF( 0, 0 ); p2 = QPointF( 0, 0 ); points = 0; } VArc::VArc (const QMap *points, qint64 center, qreal radius, qreal f1, qreal f2 ){ this->points = points; ModifiArc( center, radius, f1, f2 ); } qreal VArc::GetF1 () const{ return f1; } qreal VArc::GetF2 () const{ return f2; } qreal VArc::GetLength () const{ return length; } qreal VArc::GetRadius () const{ return radius; } qint64 VArc::GetCenter() const{ return center; } QPointF VArc::GetCenterPoint() const{ if(points->contains(center)){ return points->value(center); } else { qCritical()<<"Не можу знайти id = "< *VArc::GetDataPoints() const{ return points; } void VArc::ModifiArc (qint64 center, qreal radius, qreal f1, qreal f2 ){ this->f1 = f1; this->f2 = f2; this->radius = radius; this->center = center; QPointF p1 ( GetCenterPoint().x () + radius, GetCenterPoint().y () ); QLineF centerP1(GetCenterPoint(), p1); centerP1.setAngle(f1); p1 = centerP1.p2(); QPointF p2 ( GetCenterPoint().x () + radius, GetCenterPoint().y () ); QLineF centerP2(GetCenterPoint(), p2); centerP2.setAngle(f2); p2 = centerP2.p2(); this->p1 = p1; this->p2 = p2; // визначимо довжину дуги за формулою. // МОЖЛИВО НЕ ПРАВИЛЬНО. ПОТРІБНО ПЕРЕВІРИТИ ФОРМУЛУ, ОСКІЛЬКИ КУТ ПОВЕРТАЄТЬСЯ В ГРАДУСАХ!!!!! //qreal ang = AngleArc ( f1, f2 ) ; qreal ang = centerP1.angleTo(centerP2); this->length = ang * radius * M_PI/180; //qDebug()<<"ang = "<center = QPointF( center.x()+mx, center.y()+my ); // this->p1 = QPointF( p1.x()+mx, p1.y()+my ); // this->p2 = QPointF( p2.x()+mx, p2.y()+my ); //} //void VArc::RotationArc (QPointF pRotate, qreal angle ){ // QLineF pRotateCenter( pRotate, center ); // pRotateCenter.setAngle( angle ); // center = pRotateCenter.p2(); // QLineF pRotateP1( pRotate, p1 ); // pRotateP1.setAngle( angle ); // p1 = pRotateP1.p2(); // QLineF pRotateP2( pRotate, p2 ); // pRotateP2.setAngle( angle ); // p2 = pRotateP2.p2(); // QLineF centerP1 ( center, p1 ); // QLineF centerP2 ( center, p2 ); // f1 = centerP1.angle(); // f2 = centerP2.angle(); //} VSpline VArc::SplOfArc ( qint32 number ) const{ qint32 n = NumberSplOfArc (); if( number > n ){ throw "Дуга не складається з такої кількості сплайнів."; } qreal f1 = GetF1 (); qreal f2 = GetF2 (); qint32 i; for ( i = 0; i < n; ++i ){ if ( i == n - 1 ){ f2 = GetF2 (); } else { if ( f1 + 90 > 360 ){ f2 = f1 + 90 - 360; } else { f2 = f1 + 90; } } qreal anglF1, anglF2; if ( f1 + 90 > 360 ){ anglF1 = f1 + 90 - 360 ; } else { anglF1 = f1 + 90 ; } if ( f2 - 90 < 0 ){ anglF2 = 360 + f2 - 90 ; } else { anglF2 = f2 - 90 ; } if ( i + 1 == number ){ // return VSpline (GetDataPoints(), GetP1 (), GetP2 (), anglF1, anglF2, 1., 1., 1. ); f1 = f2; } } return VSpline(); } //void VArc::CutArc ( qreal length, VArc &arcFir, VArc &arcSec ) const{ // if ( length > GetLength () ){ // qDebug()<<"Не правильна довжина дуги/n"; // exit(-1); // } // qreal angle; // angle = GetF1 () + (length * 180) / (radius * M_PI); // arcFir.ModifiArc ( GetCenter (), GetRadius (), GetF1 (), angle ); // arcSec.ModifiArc ( GetCenter (), GetRadius (), angle, GetF2 () ); //} //void VArc::CutArc ( QPointF point, VArc &arcFir, VArc &arcSec ) const{ // VArc arc = VArc(center,radius, f1, QLineF(center, point).angle()); // if(this->length VArc::GetPoints () const{ QVector points; qint32 numberSpl = NumberSplOfArc(); for(qint32 i = 1; i <= numberSpl; ++i){ VSpline spl = SplOfArc ( i ); points< GetRadius() + CO.length() ){ throw"Немає перетину кіл для знаходження дотичних."; } if ( d < qAbs(GetRadius() - CO.length()) ){ throw"Не можу знайти дотичну. Одне коло знаходиться в іншому."; } qreal a = (pow(GetRadius(),2) - pow(CO.length(),2) + pow(d,2) ) / (2*d); qreal h = sqrt(pow(GetRadius(),2) - pow(a,2)); qreal x2 = GetCenterPoint().x() + a * (O.x() - GetCenterPoint().x())/d; qreal y2 = GetCenterPoint().y() + a * (O.y() - GetCenterPoint().y())/d; if(tan == VArc::FirstTangent){ qreal x3 = x2 - h * ( O.y() - GetCenterPoint().y() ) / d; qreal y3 = y2 + h * ( O.x() - GetCenterPoint().x() ) / d; return QPointF(x3,y3); } else { qreal x3 = x2 + h * ( O.y() - GetCenterPoint().y() ) / d; qreal y3 = y2 - h * ( O.x() - GetCenterPoint().x() ) / d; return QPointF(x3,y3); } } bool VArc::Contains(const QPointF P)const{ QVector points = GetPoints (); for(qint32 i=0; i< points.size();++i){ if((qint32)points[i].x()==(qint32)P.x() && (qint32)points[i].y()==(qint32)P.y()){ return true; } } return false; } QPointF VArc::PutAlongArc(qreal length) const{ if(GetLength()ModifiArc ( Center, radius, QLineF(Center,P2).angle(), QLineF(Center,P1).angle() ); //}