Qwt User's Guide svn
qwt_point_polar.h
00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00011 #ifndef _QWT_POINT_POLAR_H_
00012 #define _QWT_POINT_POLAR_H_ 1
00013 
00014 #include "qwt_global.h"
00015 #include "qwt_math.h"
00016 #include <qpoint.h>
00017 #ifndef QT_NO_DEBUG_STREAM
00018 #include <qdebug.h>
00019 #endif
00020 
00028 class QWT_EXPORT QwtPointPolar
00029 {
00030 public:
00031     QwtPointPolar();
00032     QwtPointPolar( double azimuth, double radius );
00033     QwtPointPolar( const QwtPointPolar & );
00034     QwtPointPolar( const QPointF & );
00035 
00036     void setPoint( const QPointF & );
00037     QPointF toPoint() const;
00038 
00039     bool isValid() const;
00040     bool isNull() const;
00041 
00042     double radius() const;
00043     double azimuth() const;
00044 
00045     double &rRadius();
00046     double &rAzimuth();
00047 
00048     void setRadius( double );
00049     void setAzimuth( double );
00050 
00051     bool operator==( const QwtPointPolar & ) const;
00052     bool operator!=( const QwtPointPolar & ) const;
00053 
00054     QwtPointPolar normalized() const;
00055 
00056 private:
00057     double d_azimuth;
00058     double d_radius;
00059 };
00060 
00065 inline QwtPointPolar::QwtPointPolar():
00066     d_azimuth( 0.0 ),
00067     d_radius( 0.0 )
00068 {
00069 }
00070 
00077 inline QwtPointPolar::QwtPointPolar( double azimuth, double radius ):
00078     d_azimuth( azimuth ),
00079     d_radius( radius )
00080 {
00081 }
00082 
00087 inline QwtPointPolar::QwtPointPolar( const QwtPointPolar &other ):
00088     d_azimuth( other.d_azimuth ),
00089     d_radius( other.d_radius )
00090 {
00091 }
00092 
00094 inline bool QwtPointPolar::isValid() const
00095 {
00096     return d_radius >= 0.0;
00097 }
00098 
00100 inline bool QwtPointPolar::isNull() const
00101 {
00102     return d_radius == 0.0;
00103 }
00104 
00106 inline double QwtPointPolar::radius() const
00107 {
00108     return d_radius;
00109 }
00110 
00112 inline double QwtPointPolar::azimuth() const
00113 {
00114     return d_azimuth;
00115 }
00116 
00118 inline double &QwtPointPolar::rRadius()
00119 {
00120     return d_radius;
00121 }
00122 
00124 inline double &QwtPointPolar::rAzimuth()
00125 {
00126     return d_azimuth;
00127 }
00128 
00130 inline void QwtPointPolar::setRadius( double radius )
00131 {
00132     d_radius = radius;
00133 }
00134 
00136 inline void QwtPointPolar::setAzimuth( double azimuth )
00137 {
00138     d_azimuth = azimuth;
00139 }
00140 
00141 #ifndef QT_NO_DEBUG_STREAM
00142 QWT_EXPORT QDebug operator<<( QDebug, const QwtPointPolar & );
00143 #endif
00144 
00145 inline QPoint qwtPolar2Pos( const QPoint &pole,
00146     double radius, double angle )
00147 {
00148     const double x = pole.x() + radius * qCos( angle );
00149     const double y = pole.y() - radius * qSin( angle );
00150 
00151     return QPoint( qRound( x ), qRound( y ) );
00152 }
00153 
00154 inline QPoint qwtDegree2Pos( const QPoint &pole,
00155     double radius, double angle )
00156 {
00157     return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI );
00158 }
00159 
00160 inline QPointF qwtPolar2Pos( const QPointF &pole,
00161     double radius, double angle )
00162 {
00163     const double x = pole.x() + radius * qCos( angle );
00164     const double y = pole.y() - radius * qSin( angle );
00165 
00166     return QPointF( x, y);
00167 }
00168 
00169 inline QPointF qwtDegree2Pos( const QPointF &pole,
00170     double radius, double angle )
00171 {
00172     return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI );
00173 }
00174 
00175 inline QPointF qwtFastPolar2Pos( const QPointF &pole,
00176     double radius, double angle )
00177 {
00178 #if QT_VERSION < 0x040601
00179     const double x = pole.x() + radius * ::cos( angle );
00180     const double y = pole.y() - radius * ::sin( angle );
00181 #else
00182     const double x = pole.x() + radius * qFastCos( angle );
00183     const double y = pole.y() - radius * qFastSin( angle );
00184 #endif
00185 
00186     return QPointF( x, y);
00187 }
00188 
00189 inline QPointF qwtFastDegree2Pos( const QPointF &pole,
00190     double radius, double angle )
00191 {   
00192     return qwtFastPolar2Pos( pole, radius, angle / 180.0 * M_PI );
00193 } 
00194 
00195 #endif 
qmi style