/** * @RDE_HEADER@ * Class Geometry * $Id$ * $HeadURL$ * $Author$ */ // Own #include "geometry.h" #include //---------------------------------------------------------------------------- namespace SituationMap { QList Geometry::createCircle(const QPointF ¢er, qreal radius, int steps) { QList circle; circle.reserve(steps); if (steps < 10) steps = 10; for (int i = 0; i < 360; i += (360 / steps)) { double winkel = i * M_PI / 180.0; circle << (center + QPointF(cos(winkel) * radius, sin(winkel) * radius)); } circle << circle.value(0); // 'close' the circle // circle.translate(center); return circle; } QList Geometry::createArcSegment(const QPointF ¢er, qreal radius, double startAngle_degree, double angleOffset_clockwise_degree, int stepsPer360) { QList points; if (stepsPer360 < 10) stepsPer360 = 10; startAngle_degree *= -1.0; startAngle_degree += 90; // normalize startAngle_degree = fmod(startAngle_degree, 360); angleOffset_clockwise_degree = fmod(angleOffset_clockwise_degree, 360); // steps int steps = fabs(angleOffset_clockwise_degree) * stepsPer360 / 360; points.reserve(steps + 1); double startAngle_rad = startAngle_degree * M_PI / 180.0; double angleOffset_right_rad = angleOffset_clockwise_degree * M_PI / 180.0; for (int i = 0; i < steps; ++i) { // '-' to go clockwise: double winkel_rad = (startAngle_rad - (i * angleOffset_right_rad / steps)); points << (center + QPointF(cos(winkel_rad) * radius, sin(winkel_rad) * radius)); } // calculate very last iteration (independent from 'steps'): double winkel_rad = (startAngle_rad - (angleOffset_right_rad)); points << (center + QPointF(cos(winkel_rad) * radius, sin(winkel_rad) * radius)); return points; } } // namespace SituationMap