File indexing completed on 2024-06-23 04:25:57

0001 /*
0002  * SPDX-FileCopyrightText: 2010 Geoffry Song <goffrie@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #ifndef _ELLIPSE_H_
0008 #define _ELLIPSE_H_
0009 
0010 #include <QPointF>
0011 #include <QTransform>
0012 
0013 class Ellipse
0014 {
0015 public:
0016     Ellipse();
0017     Ellipse(const QPointF& p1, const QPointF& p2, const QPointF& p3);
0018     ~Ellipse();
0019     
0020     QPointF project(const QPointF&) const; // find a close point on the ellipse
0021     QRectF boundingRect() const; // find an axis-aligned box bounding this ellipse (inexact)
0022     
0023     bool set(const QPointF& m1, const QPointF& m2, const QPointF& p); // set all points
0024     
0025     const QPointF& major1() const { return p1; }
0026     bool setMajor1(const QPointF& p);
0027     const QPointF& major2() const { return p2; }
0028     bool setMajor2(const QPointF& p);
0029     const QPointF& point() const { return p3; }
0030     bool setPoint(const QPointF& p);
0031     const QTransform& getTransform() const { return matrix; }
0032     const QTransform& getInverse() const { return inverse; }
0033     qreal semiMajor() const { return a; }
0034     qreal semiMinor() const { return b; }
0035     
0036 private:
0037     bool changeMajor(); // determine 'a', 'b', 'matrix' and 'inverse'
0038     bool changeMinor(); // determine 'b'
0039     
0040     QTransform matrix; // transformation turning p1, p2 and p3 into their corresponding points on the ellipse in canonical position
0041     QTransform inverse; // inverse transformation
0042     qreal a; // semi-major axis: half the distance between p1 and p2 (horizontal axis)
0043     qreal b; // semi-minor axis (vertical axis)
0044     // a may not actually be larger than b, but we don't care that much
0045     
0046     QPointF p1;
0047     QPointF p2;
0048     QPointF p3;
0049 };
0050 
0051 #endif