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