summaryrefslogtreecommitdiffstats
path: root/kig/misc/coordinate.h
diff options
context:
space:
mode:
Diffstat (limited to 'kig/misc/coordinate.h')
-rw-r--r--kig/misc/coordinate.h169
1 files changed, 169 insertions, 0 deletions
diff --git a/kig/misc/coordinate.h b/kig/misc/coordinate.h
new file mode 100644
index 00000000..a56edb76
--- /dev/null
+++ b/kig/misc/coordinate.h
@@ -0,0 +1,169 @@
+/**
+ This file is part of Kig, a KDE program for Interactive Geometry...
+ Copyright (C) 2002 Dominique Devriese <devriese@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ USA
+**/
+
+
+#ifndef KIG_MISC_COORDINATE_H
+#define KIG_MISC_COORDINATE_H
+
+class QPoint;
+class kdbgstream;
+
+/**
+ * The Coordinate class is the basic class representing a 2D location
+ * by its x and y components. It has all relevant arithmetic
+ * operators properly defined, and should be straightforward to use..
+ */
+class Coordinate
+{
+public:
+ static Coordinate fromQPoint( const QPoint& p );
+
+ /** Constructor. Construct a new Coordinate, with a given x and y
+ * value.
+ */
+ Coordinate( double x, double y );
+ /** Copy Constructor. Construct a new Coordinate, and give it the
+ * same value as p.
+ */
+ Coordinate( const Coordinate& p );
+ /**
+ * \ifnot creating-python-scripting-doc
+ * \brief Default Constructor
+ *
+ * Constructs a new Coordinate, with x and y initialized to 0.
+ * \endif
+ */
+ Coordinate();
+ ~Coordinate() {}
+
+ /** Create an invalid Coordinate. This is a special value of a
+ * Coordinate that signals that something went wrong..
+ *
+ * \see Coordinate::valid
+ *
+ * \internal We represent an invalid coordinate by setting x or y to
+ * positive or negative infinity. This is handy, since it doesn't
+ * require us to adapt most of the functions, it doesn't need extra
+ * space, and most of the times that we should get an invalid coord,
+ * we get one automatically..
+ */
+ static Coordinate invalidCoord();
+ /** Return whether this is a valid Coordinate.
+ * \see Coordinate::invalidCoord
+ */
+ bool valid() const;
+
+ /** Distance to another Coordinate.
+ */
+ double distance ( const Coordinate& p ) const;
+ /** Length. Returns the length or norm of this coordinate.
+ * I.e. return the distance from this Coordinate to the origin.
+ * \see squareLength
+ */
+ double length () const;
+ /** Square length. Equivalent to the square of \ref length, but a
+ * bit more efficient because no square root has to be calculated.
+ * \see length
+ */
+ inline double squareLength() const;
+ /** Inverse. Returns the inverse of this Coordinate.
+ */
+ const Coordinate operator- () const;
+ /** Orthogonal. Returns a vector which is orthogonal on this vector.
+ * This relation always holds:
+ * <pre>
+ * Coordinate a = ...;
+ * assert( a*a.orthogonal() ) == 0;
+ * </pre>
+ */
+ const Coordinate orthogonal() const;
+ /** Round. Returns this coordinate, rounded to the nearest integral
+ * values.
+ */
+ const Coordinate round() const;
+ /** Normalize. This sets the length to length, while keeping the
+ * x/y ratio untouched...
+ */
+ const Coordinate normalize( double length = 1 ) const;
+ QPoint toQPoint() const;
+
+ Coordinate& operator= ( const Coordinate& c );
+ /** Add. Add c to this Coordinate
+ */
+ Coordinate& operator+= ( const Coordinate& c );
+ /** Subtract. Subtract c from this Coordinate
+ */
+ Coordinate& operator-= ( const Coordinate& c );
+ /** Scale. Scales this Coordinate by a factor r
+ */
+ Coordinate& operator*= ( double r );
+ /** Scale. Scales this Coordinate by a factor r
+ */
+ Coordinate& operator*= ( int r );
+ /** Scale. Scales this Coordinate by a factor 1/r
+ */
+ Coordinate& operator/= ( double r );
+public:
+ /** X Component. The X Component of this Coordinate.
+ */
+ double x;
+ /** Y Component. The Y Component of this Coordinate.
+ */
+ double y;
+
+ friend kdbgstream& operator<<( kdbgstream& s, const Coordinate& t );
+ /** Add. Returns the sum of a and b.
+ */
+ friend const Coordinate operator+ ( const Coordinate& a, const Coordinate& b );
+ /** Subtract. Returns the difference between a and b.
+ */
+ friend const Coordinate operator- ( const Coordinate& a, const Coordinate& b );
+ /** Scale. Returns this a, scaled by a factor of r.
+ */
+ friend const Coordinate operator* ( const Coordinate& a, double r );
+ /** Scale. Returns a, scaled by a factor of 1/r.
+ */
+ friend const Coordinate operator/ ( const Coordinate& a, double r );
+ /** Scalar Product. Returns the scalar product of a and b.
+ */
+ friend double operator*( const Coordinate& a, const Coordinate& b );
+ /** Equal. Tests two Coordinates for equality.
+ */
+ friend bool operator==( const Coordinate&, const Coordinate& );
+ /** Not Equal. Tests two Coordinates for inequality.
+ */
+ friend bool operator!=( const Coordinate&, const Coordinate& );
+};
+
+const Coordinate operator/ ( const Coordinate& a, double r );
+kdbgstream& operator<<( kdbgstream& s, const Coordinate& t );
+const Coordinate operator+ ( const Coordinate& a, const Coordinate& b );
+const Coordinate operator- ( const Coordinate& a, const Coordinate& b );
+const Coordinate operator* ( const Coordinate& a, double r );
+const Coordinate operator* ( double r, const Coordinate& a );
+double operator*( const Coordinate& a, const Coordinate& b );
+
+double Coordinate::squareLength() const
+{
+ return x*x+y*y;
+}
+
+#endif
+