QGIS/python/core/qgspoint.sip
Nyall Dawson 2e44c11914 Some QgsPoint improvements
- Modernize QgsVector, improve docs, add some methods missing from
Python bindings
- Add method to QgsPoint to project a point by a specified distance
and bearing
- Add distance methods to complement existing sqrDist squared distance
methods
- Rename QgsVector::normal to normalized (avoid confusion with normal
vectors)
- Add more QgsPoint operators
- Add some more QgsPoint and QgsVector tests
2016-04-06 20:55:26 +10:00

308 lines
9.4 KiB
Plaintext

/** \ingroup core
* A class to represent a vector.
* Currently no Z axis / 2.5D support is implemented.
*/
class QgsVector
{
%TypeHeaderCode
#include <qgspoint.h>
%End
public:
/** Default constructor for QgsVector. Creates a vector with length of 0.0.
*/
QgsVector();
/** Constructor for QgsVector taking x and y component values.
* @param x x-component
* @param y y-component
*/
QgsVector( double x, double y );
//! Swaps the sign of the x and y components of the vector.
QgsVector operator-() const;
/** Returns a vector where the components have been multiplied by a scalar value.
* @param scalar factor to multiply by
*/
QgsVector operator*( double scalar ) const;
/** Returns a vector where the components have been divided by a scalar value.
* @param scalar factor to divide by
*/
QgsVector operator/( double scalar ) const;
/** Returns the sum of the x component of this vector multiplied by the x component of another
* vector plus the y component of this vector multipled by the y component of another vector.
*/
double operator*( QgsVector v ) const;
/** Returns the length of the vector.
*/
double length() const;
/** Returns the vector's x-component.
* @see y()
*/
double x() const;
/** Returns the vector's y-component.
* @see x()
*/
double y() const;
/** Returns the perpendicular vector to this vector (rotated 90 degrees counter-clockwise)
*/
QgsVector perpVector() const;
/** Returns the angle of the vector in radians.
*/
double angle() const;
/** Returns the angle between this vector and another vector in radians.
*/
double angle( QgsVector v ) const;
/** Rotates the vector by a specified angle.
* @param rot angle in radians
*/
QgsVector rotateBy( double rot ) const;
/** Returns the vector's normalized (or "unit") vector (ie same angle but length of 1.0). Will throw an expection
* if called on a vector with length of 0.
* @deprecated use normalized() instead
*/
QgsVector normal() const /Deprecated/;
/** Returns the vector's normalized (or "unit") vector (ie same angle but length of 1.0). Will throw an expection
* if called on a vector with length of 0.
*/
QgsVector normalized() const;
};
/** \ingroup core
* A class to represent a point.
* Currently no Z axis / 2.5D support is implemented.
*/
class QgsPoint
{
%TypeHeaderCode
#include <qgspoint.h>
#include <QString>
%End
public:
/// Default constructor
QgsPoint();
/** Create a point from another point */
QgsPoint( const QgsPoint& p );
/** Create a point from x,y coordinates
* @param x x coordinate
* @param y y coordinate
*/
QgsPoint( double x, double y );
/** Create a point from a QPointF
* @param point QPointF source
* @note added in QGIS 2.7
*/
QgsPoint( QPointF point );
/** Create a point from a QPoint
* @param point QPoint source
* @note added in QGIS 2.7
*/
QgsPoint( QPoint point );
~QgsPoint();
/** Sets the x value of the point
* @param x x coordinate
*/
void setX( double x );
/** Sets the y value of the point
* @param y y coordinate
*/
void setY( double y );
/** Sets the x and y value of the point */
void set( double x, double y );
/** Get the x value of the point
* @return x coordinate
*/
double x() const;
/** Get the y value of the point
* @return y coordinate
*/
double y() const;
/** Converts a point to a QPointF
* @returns QPointF with same x and y values
* @note added in QGIS 2.7
*/
QPointF toQPointF() const;
//! String representation of the point (x,y)
QString toString() const;
//! As above but with precision for string representation of a point
QString toString( int thePrecision ) const;
/** Return a string representation as degrees minutes seconds.
* Its up to the calling function to ensure that this point can
* be meaningfully represented in this form.
* @param thePrecision number of decimal points to use for seconds
* @param useSuffix set to true to include a direction suffix (eg 'N'),
* set to false to use a "-" prefix for west and south coordinates
* @param padded set to true to force minutes and seconds to use two decimals,
* eg, '05' instead of '5'.
*/
QString toDegreesMinutesSeconds( int thePrecision, const bool useSuffix = true, const bool padded = false ) const;
/** Return a string representation as degrees minutes.
* Its up to the calling function to ensure that this point can
* be meaningfully represented in this form.
* @param thePrecision number of decimal points to use for minutes
* @param useSuffix set to true to include a direction suffix (eg 'N'),
* set to false to use a "-" prefix for west and south coordinates
* @param padded set to true to force minutes to use two decimals,
* eg, '05' instead of '5'.
*/
QString toDegreesMinutes( int thePrecision, const bool useSuffix = true, const bool padded = false ) const;
/** Return the well known text representation for the point.
* The wkt is created without an SRID.
* @return Well known text in the form POINT(x y)
*/
QString wellKnownText() const;
/** Returns the squared distance between this point a specified x, y coordinate.
* @see distance()
*/
double sqrDist( double x, double y ) const;
/** Returns the squared distance between this point another point.
* @see distance()
*/
double sqrDist( const QgsPoint& other ) const;
/** Returns the distance between this point and a specified x, y coordinate.
* @param x x-coordniate
* @param y y-coordinate
* @see sqrDist()
* @note added in QGIS 2.16
*/
double distance( double x, double y ) const;
/** Returns the distance between this point and another point.
* @param other other point
* @see sqrDist()
* @note added in QGIS 2.16
*/
double distance( const QgsPoint& other ) const;
/** Returns the minimum distance between this point and a segment */
double sqrDistToSegment( double x1, double y1, double x2, double y2, QgsPoint& minDistPoint /Out/, double epsilon = DEFAULT_SEGMENT_EPSILON ) const;
/** Calculates azimuth between this point and other one (clockwise in degree, starting from north) */
double azimuth( const QgsPoint& other ) const;
/** Returns a new point which correponds to this point projected by a specified distance
* in a specified bearing.
* @param distance distance to project
* @param bearing angle to project in, clockwise in degrees starting from north
* @note added in QGIS 2.16
*/
QgsPoint project( double distance, double bearing ) const;
/** Compares this point with another point with a fuzzy tolerance
* @param other point to compare with
* @param epsilon maximum difference for coordinates between the points
* @returns true if points are equal within specified tolerance
* @note added in QGIS 2.9
*/
bool compare( const QgsPoint &other, double epsilon = 4 * DBL_EPSILON ) const;
//! equality operator
bool operator==( const QgsPoint &other );
//! Inequality operator
bool operator!=( const QgsPoint &other ) const;
//! Multiply x and y by the given value
void multiply( double scalar );
//! Test if this point is on the segment defined by points a, b
//! @return 0 if this point is not on the open ray through a and b,
//! 1 if point is on open ray a, 2 if point is within line segment,
//! 3 if point is on open ray b.
int onSegment( const QgsPoint& a, const QgsPoint& b ) const;
//! Calculates the vector obtained by subtracting a point from this point
QgsVector operator-( const QgsPoint& p ) const;
//! Adds a vector to this point in place
QgsPoint &operator+=( QgsVector v );
//! Subtracts a vector from this point in place
QgsPoint &operator-=( QgsVector v );
//! Adds a vector to this point
QgsPoint operator+( QgsVector v ) const;
//! Subtracts a vector from this point
QgsPoint operator-( QgsVector v ) const;
//! Multiplies the coordinates in this point by a scalar quantity
QgsPoint operator*( double scalar ) const;
//! Divides the coordinates in this point by a scalar quantity
QgsPoint operator/( double scalar ) const;
//! Multiplies the coordinates in this point by a scalar quantity in place
QgsPoint &operator*=( double scalar );
//! Divides the coordinates in this point by a scalar quantity in place
QgsPoint &operator/=( double scalar );
SIP_PYOBJECT __repr__();
%MethodCode
QString str = "(" + QString::number(sipCpp->x()) + "," + QString::number(sipCpp->y()) + ")";
//QString str("(%f,%f)").arg(sipCpp->x()).arg(sipCpp->y());
sipRes = PyUnicode_FromString( str.toUtf8().data() );
%End
int __len__();
%MethodCode
sipRes = 2;
%End
SIP_PYOBJECT __getitem__(int);
%MethodCode
if (a0 == 0) {
sipRes = Py_BuildValue("d",sipCpp->x());
} else if (a0 == 1) {
sipRes = Py_BuildValue("d",sipCpp->y());
} else {
QString msg = QString("Bad index: %1").arg(a0);
PyErr_SetString(PyExc_IndexError, msg.toAscii().constData());
}
%End
long __hash__() const;
%MethodCode
sipRes = qHash( *sipCpp );
%End
}; // class QgsPoint