Skip to content
Circle.cc 3.86 KiB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#include "Circle.h"



Circle::Circle(QObject *parent)
    :   QObject (parent)
    ,   _circleRadius(0)
    ,   _circleOrigin(QPointF(0,0))
{

}

Circle::Circle(double radius, QObject *parent)
    :   QObject (parent)
    ,   _circleRadius(radius >= 0 ? radius : 0)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    ,   _circleOrigin(QPointF(0,0))
{
}

Circle::Circle(double radius, QPointF origin, QObject *parent)
    :   QObject (parent)
    ,   _circleRadius(radius >= 0 ? radius : 0)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    ,   _circleOrigin(origin)
{
}

Circle::Circle(const Circle &other, QObject *parent)
    :   QObject (parent)
{
    *this = other;
}

Circle &Circle::operator=(const Circle &other)
{
    this->setRadius(other.radius());
    this->setOrigin(other.origin());

    return *this;
}

/*!
 * \fn void Circle::setRadius(double radius)
 * Sets the radius of the circle to \a radius
 */
void Circle::setRadius(double radius)
{
    if ( radius >= 0 && !qFuzzyCompare(_circleRadius, radius) ) {
        _circleRadius = radius;

        emit radiusChanged(_circleRadius);
    }
}

/*!
 * \fn void Circle::setOrigin(const QPointF &origin)
 * Sets the origin of the circle to \a origin
 *
 * \sa QPointF
 */
void Circle::setOrigin(const QPointF &origin)
{
    if (origin != _circleOrigin) {
        _circleOrigin = origin;

        emit originChanged(_circleOrigin);
    }
}

/*!
 * \fn double Circle::radius() const
 * Returns the radius of the circle.
 */
double Circle::radius() const
{
    return _circleRadius;
}

/*!
 * \fn QPointF Circle::origin() const
 * Returns the origin of the circle.
 *
 * \sa QPointF
 */
QPointF Circle::origin() const
{
    return _circleOrigin;
}


/*!
 * \fn QList<QPointF> Circle::approximate(int numberOfCorners)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
 * Returns a polygon with \a numberOfCorners corners which approximates the circle.
 *
 * \sa QPointF
 */
QList<QPointF> Circle::approximate(int numberOfCorners) const
Valentin Platzgummer's avatar
Valentin Platzgummer committed
{
    if ( numberOfCorners < 3)
        return QList<QPointF>();
    return approximateSektor(numberOfCorners+1, 0, 2*M_PI);
QList<QPointF> Circle::approximate(double angleDiscretisation) const
{
    return approximateSektor(angleDiscretisation, 0, 2*M_PI);
}

QList<QPointF> Circle::approximateSektor(int numberOfCorners, double alpha1, double alpha2) const
    if ( numberOfCorners < 3)
        return QList<QPointF>();
    return approximateSektor((alpha2-alpha1)/double(numberOfCorners-1), alpha1, alpha2);
}

QList<QPointF> Circle::approximateSektor(double angleDiscretisation, double alpha1, double alpha2) const
    using namespace PlanimetryCalculus;
    // truncate alpha1 to [0, 2*pi], fmod() does not work in this case
    alpha1              = truncateAngle(alpha1);
    alpha2              = truncateAngle(alpha2);
    double deltaAlpha   = truncateAngle(alpha2 - alpha1);
    angleDiscretisation = truncateAngle(angleDiscretisation)*signum(angleDiscretisation);
    if (fabs(angleDiscretisation) > deltaAlpha || qFuzzyIsNull(angleDiscretisation))
        return QList<QPointF>();
    QList<QPointF> sector;
    QPointF vertex0(_circleRadius,0); // initial vertex
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    // rotate the vertex numberOfCorners-1 times add the origin and append to the polygon.
    do {
        QPointF currentVertex = rotateReturn(vertex0, currentAngle);
        sector.append(currentVertex + _circleOrigin);
        currentAngle = PlanimetryCalculus::truncateAngle(currentAngle + angleDiscretisation);
    }while(currentAngle < alpha2);
    QPointF currentVertex = rotateReturn(vertex0, alpha2) + _circleOrigin;
    if (   !qFuzzyIsNull(PlanimetryCalculus::distance(sector.first(), currentVertex))
        && !qFuzzyIsNull(PlanimetryCalculus::distance(sector.last(), currentVertex )) ){
        sector.append(currentVertex);
    return sector;
bool Circle::isNull() const
{
    return _circleRadius <= 0 ? true : false;
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
/*!
 * \class Circle
 * \brief Provies a circle with radius and origin.
 *
 * \sa QPointF
 */