00001
00022 #ifndef KIG_MISC_COMMON_H
00023 #define KIG_MISC_COMMON_H
00024
00025 #include "coordinate.h"
00026 #include "rect.h"
00027
00028 #include <qrect.h>
00029
00030 #include <vector>
00031 #include <assert.h>
00032
00033 class ObjectImp;
00034 class KigWidget;
00035
00036 extern const double double_inf;
00037
00043 double getDoubleFromUser( const QString& caption, const QString& label, double value,
00044 QWidget* parent, bool* ok, double min, double max, int decimals );
00045
00049 class LineData {
00050 public:
00056 LineData() : a(), b() {}
00060 LineData( const Coordinate& na, const Coordinate& nb ) : a( na ), b( nb ) {}
00064 Coordinate a;
00068 Coordinate b;
00072 const Coordinate dir() const { return b - a; }
00076 double length() const { return ( b - a ).length(); }
00077
00081 bool isParallelTo( const LineData& l ) const;
00082
00086 bool isOrthogonalTo( const LineData& l ) const;
00087 };
00088
00092 bool operator==( const LineData& l, const LineData& r );
00093
00098 Coordinate calcRotatedPoint( const Coordinate& a, const Coordinate& c, const double arc );
00099
00104 Coordinate calcPointOnPerpend( const LineData& l, const Coordinate& t );
00105
00110 Coordinate calcPointOnPerpend( const Coordinate& dir, const Coordinate& t );
00111
00116 Coordinate calcPointOnParallel( const LineData& l, const Coordinate& t );
00117
00122 Coordinate calcPointOnParallel( const Coordinate& dir, const Coordinate& t );
00123
00124
00128 Coordinate calcIntersectionPoint( const LineData& l, const LineData& m );
00129
00139 const Coordinate calcCircleLineIntersect( const Coordinate& c,
00140 const double sqr,
00141 const LineData& l,
00142 int side );
00143
00153 const Coordinate calcArcLineIntersect( const Coordinate& c, const double sqr,
00154 const double sa, const double angle,
00155 const LineData& l, int side );
00156
00161 const Coordinate calcPointProjection( const Coordinate& p,
00162 const LineData& l );
00163
00167 double calcDistancePointLine( const Coordinate& p,
00168 const LineData& l );
00169
00174 void calcBorderPoints( Coordinate& p1, Coordinate& p2, const Rect& r );
00178 void calcBorderPoints( double& xa, double& xb, double& ya, double& yb, const Rect& r);
00182 const LineData calcBorderPoints( const LineData& l, const Rect& r );
00183
00187 void calcRayBorderPoints( const Coordinate& a, Coordinate& b, const Rect& r );
00188
00193 const Coordinate calcCenter(
00194 const Coordinate& a, const Coordinate& b, const Coordinate& c );
00195
00199 void calcRayBorderPoints( const double xa, const double xb, double& ya,
00200 double& yb, const Rect& r );
00201
00205 const Coordinate calcMirrorPoint( const LineData& l,
00206 const Coordinate& p );
00207
00211 bool areCollinear( const Coordinate& p1, const Coordinate& p2,
00212 const Coordinate& p3 );
00213
00218 bool isSingular( const double& a, const double& b,
00219 const double& c, const double& d );
00220
00225 bool isOnLine( const Coordinate& o, const Coordinate& a,
00226 const Coordinate& b, const double fault );
00227
00233 bool isOnSegment( const Coordinate& o, const Coordinate& a,
00234 const Coordinate& b, const double fault );
00235
00236 bool isOnRay( const Coordinate& o, const Coordinate& a,
00237 const Coordinate& b, const double fault );
00238
00239 bool isOnArc( const Coordinate& o, const Coordinate& c, const double r,
00240 const double sa, const double a, const double fault );
00241
00242 Coordinate calcCircleRadicalStartPoint( const Coordinate& ca,
00243 const Coordinate& cb,
00244 double sqra, double sqrb );
00245
00251 bool lineInRect( const Rect& r, const Coordinate& a, const Coordinate& b,
00252 const int width, const ObjectImp* imp, const KigWidget& w );
00253
00254 template <typename T>
00255 T kigMin( const T& a, const T& b )
00256 {
00257 return a < b ? a : b;
00258 }
00259
00260 template <typename T>
00261 T kigMax( const T& a, const T& b )
00262 {
00263 return a > b ? a : b;
00264 }
00265
00266 template <typename T>
00267 T kigAbs( const T& a )
00268 {
00269 return a >= 0 ? a : -a;
00270 }
00271
00272 template <typename T>
00273 int kigSgn( const T& a )
00274 {
00275 return a == 0 ? 0 : a > 0 ? +1 : -1;
00276 }
00277
00278 extern const double test_threshold;
00279
00280 #endif