You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
8.6 KiB
330 lines
8.6 KiB
/***************************************************************************
|
|
qscoord.h
|
|
-------------------
|
|
begin : 01-January-2000
|
|
copyright : (C) 2000 by Kamil Dobkowski
|
|
email : kamildobk@poczta.onet.pl
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef QSCOORD_H
|
|
#define QSCOORD_H
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include<qwindowdefs.h>
|
|
#include<qrect.h>
|
|
#include<qpoint.h>
|
|
|
|
|
|
/**
|
|
* \brief Base class for point objects.
|
|
*
|
|
* @author Kamil Dobkowski
|
|
*/
|
|
class QSCoord {
|
|
public:
|
|
static inline double mmToPixels( double mm, double dpi=72.0 ) { return mm*dpi/25.4; }
|
|
static inline double pixelsToMM( double pixels, double dpi=72.0 ) { return pixels*25.4/dpi; }
|
|
static inline double pointsToPixels( double points, double dpi=72.0 ) { return points*dpi/72.0; }
|
|
static inline double pixelsToPoints( double pixels, double dpi=72.0 ) { return pixels*72.0/dpi; }
|
|
};
|
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
/**
|
|
* \brief The point on the screen.
|
|
*
|
|
* Used internally.
|
|
* @author Kamil Dobkowski
|
|
*/
|
|
class QSPt2 : public QSCoord {
|
|
public:
|
|
// exactly as defined in QPoint
|
|
#if defined(_OS_MAC_)
|
|
QCOORD y;
|
|
QCOORD x;
|
|
#else
|
|
QCOORD x;
|
|
QCOORD y;
|
|
#endif
|
|
|
|
explicit QSPt2( const QPoint& p ) {
|
|
set( p.x(), p.y() );
|
|
}
|
|
QSPt2( int newX=0, int newY=0 ) {
|
|
set( newX, newY );
|
|
}
|
|
~QSPt2() {
|
|
}
|
|
QSPt2 &set( int newX, int newY ) {
|
|
x=newX;
|
|
y=newY;
|
|
return *this;
|
|
}
|
|
QPoint point() const {
|
|
return QPoint( x, y );
|
|
}
|
|
//friend ostream& operator<<( ostream& s, const QSPt2& p );
|
|
friend QSPt2 operator+ ( const QSPt2& p1, const QSPt2& p2 );
|
|
friend QSPt2 operator- ( const QSPt2& p1, const QSPt2& p2 );
|
|
friend bool operator==( const QSPt2& p1, const QSPt2& p2 );
|
|
friend bool operator!=( const QSPt2& p1, const QSPt2& p2 );
|
|
};
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
/**
|
|
* \brief The point in the 3D space.
|
|
*
|
|
* Used internally.
|
|
* @author Kamil Dobkowski
|
|
*/
|
|
class QSPt3 : public QSCoord {
|
|
public:
|
|
|
|
int x;
|
|
int y;
|
|
int z;
|
|
|
|
QSPt3( int newX=0, int newY=0, int newZ=0 ) {
|
|
set( newX, newY, newZ );
|
|
}
|
|
~QSPt3() {
|
|
}
|
|
QSPt3 &set( int newX, int newY, int newZ ) {
|
|
x=newX;
|
|
y=newY;
|
|
z=newZ;
|
|
return *this;
|
|
}
|
|
//friend ostream& operator<<( ostream& s, const QSPt3& p );
|
|
friend QSPt3 operator+ ( const QSPt3& p1, const QSPt3& p2 );
|
|
friend QSPt3 operator- ( const QSPt3& p1, const QSPt3& p2 );
|
|
friend bool operator==( const QSPt3& p1, const QSPt3& p2 );
|
|
friend bool operator!=( const QSPt3& p1, const QSPt3& p2 );
|
|
};
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
/**
|
|
* \brief The point on the screen with the floating-point coordinates.
|
|
*
|
|
* Used internally.
|
|
* @author Kamil Dobkowski
|
|
*/
|
|
class QSPt2f : public QSCoord {
|
|
public:
|
|
double x;
|
|
double y;
|
|
|
|
explicit QSPt2f( const QPoint& p ) {
|
|
set( p.x(), p.y() );
|
|
}
|
|
QSPt2f( double newX=0.0, double newY=0.0 ) {
|
|
set( newX, newY );
|
|
}
|
|
~QSPt2f() {
|
|
}
|
|
QSPt2f &set( double newX, double newY ) {
|
|
x=newX;
|
|
y=newY;
|
|
return *this;
|
|
}
|
|
QPoint point() const {
|
|
return QPoint( int(x+0.5), int(y+0.5) );
|
|
}
|
|
//friend ostream& operator<<( ostream& s, const QSPt2f& p );
|
|
friend QSPt2f operator+ ( const QSPt2f& p1, const QSPt2f& p2 );
|
|
friend QSPt2f operator- ( const QSPt2f& p1, const QSPt2f& p2 );
|
|
friend bool operator==( const QSPt2f& p1, const QSPt2f& p2 );
|
|
friend bool operator!=( const QSPt2f& p1, const QSPt2f& p2 );
|
|
};
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
/**
|
|
* \brief The point in th 3D space with the floating-point coordinates.
|
|
*
|
|
* Used internally.
|
|
* @author Kamil Dobkowski
|
|
*/
|
|
class QSPt3f : public QSCoord {
|
|
public:
|
|
|
|
double x;
|
|
double y;
|
|
double z;
|
|
|
|
QSPt3f( double newX=0.0, double newY=0.0, double newZ=0.0 ) {
|
|
set( newX, newY, newZ );
|
|
}
|
|
~QSPt3f() {
|
|
}
|
|
QSPt3f &set( double newX, double newY, double newZ ) {
|
|
x=newX;
|
|
y=newY;
|
|
z=newZ;
|
|
return *this;
|
|
}
|
|
//friend ostream& operator<<( ostream& s, const QSPt3f& p );
|
|
friend QSPt3f operator+ ( const QSPt3f& p1, const QSPt3f& p2 );
|
|
friend QSPt3f operator- ( const QSPt3f& p1, const QSPt3f& p2 );
|
|
friend bool operator==( const QSPt3f& p1, const QSPt3f& p2 );
|
|
friend bool operator!=( const QSPt3f& p1, const QSPt3f& p2 );
|
|
};
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
|
|
/**
|
|
* \brief Rectangle with floating point coordinates.
|
|
*/
|
|
class QSRectf : public QSCoord
|
|
{
|
|
public:
|
|
/**
|
|
* Position of this rectangle.
|
|
*/
|
|
QSPt2f pos;
|
|
/**
|
|
* Size of this rectangle.
|
|
*/
|
|
QSPt2f size;
|
|
/**
|
|
* Constructor
|
|
*/
|
|
QSRectf() {
|
|
}
|
|
/**
|
|
* Constructor
|
|
*/
|
|
explicit QSRectf( const QRect& r ) {
|
|
pos.x = r.left(); pos.y = r.top(); size.x = r.width(); size.y = r.height();
|
|
}
|
|
/**
|
|
* Constructor
|
|
*/
|
|
QSRectf( const QSPt2f& p2, const QSPt2f& p1, bool norm ) {
|
|
pos = p1;
|
|
size = p2-p1;
|
|
if ( norm ) { QSRectf r = normalize(); pos = r.pos; size = r.size; }
|
|
}
|
|
/**
|
|
* Constructor
|
|
*/
|
|
QSRectf( const QSPt2f& initPos, const QSPt2f& initSize ) {
|
|
pos = initPos;
|
|
size = initSize;
|
|
}
|
|
/**
|
|
* Constructor
|
|
*/
|
|
QSRectf( double x, double y, double w, double h ) {
|
|
pos.x = x;
|
|
pos.y = y;
|
|
size.x = w;
|
|
size.y = h;
|
|
}
|
|
/**
|
|
* Destructor
|
|
*/
|
|
~QSRectf() {
|
|
}
|
|
/**
|
|
* P1 is point at 'pos'. This function changes 'pos' and 'size' of this rectangle
|
|
* but never changes P2
|
|
*/
|
|
void setP1( const QSPt2f& p ) {
|
|
size = size - (p-pos);
|
|
pos = p;
|
|
}
|
|
/**
|
|
* P2 is the point at 'pos'+'size'. This function changes 'size' of this rectangle,
|
|
* but never changes 'size'.
|
|
*/
|
|
void setP2( const QSPt2f& p ) {
|
|
size = p-pos;
|
|
}
|
|
/**
|
|
* Returns 'pos'.
|
|
*/
|
|
QSPt2f p1() const {
|
|
return pos;
|
|
}
|
|
/**
|
|
* Returns 'pos'+'size'
|
|
*/
|
|
QSPt2f p2() const {
|
|
return pos+size;
|
|
}
|
|
/**
|
|
* Sets top-left ( with minimal coordinates ) corner of this rectange. Doesnt change bottom-right corner.
|
|
*/
|
|
void setTopLeft( const QSPt2f& p );
|
|
/**
|
|
* Sets bottom-right ( with maximum coordinates ) corner of this rectangle to 'p'.
|
|
* Never changes topLeft corner..
|
|
*/
|
|
void setBottomRight( const QSPt2f& p );
|
|
/**
|
|
* Returns coordinates of the top-left corner ( the corner closest to (0,0) ).
|
|
*/
|
|
QSPt2f topLeft() const;
|
|
/**
|
|
* Returns coordinates of bottom-left corner ( the corner furthermost from (0,0) )
|
|
*/
|
|
QSPt2f bottomRight() const;
|
|
/**
|
|
* Returns if point is inside the rectangle
|
|
*/
|
|
bool contains( const QSPt2f& pos ) const;
|
|
/**
|
|
* Unites the rectangle with other rectangle.
|
|
*/
|
|
void unite( const QSRectf& rect );
|
|
/**
|
|
* Normalizes rectangle ( makes size > 0 )
|
|
*/
|
|
QSRectf normalize() const;
|
|
/**
|
|
* Normalizes width ( makes it > 0 )
|
|
*/
|
|
QSRectf normalizeWidth() const;
|
|
/**
|
|
* Normalizes height ( makes it > 0 )
|
|
*/
|
|
QSRectf normalizeHeight() const;
|
|
/**
|
|
* Rounds coordinates and converst rectangle to QRect.
|
|
*/
|
|
QRect rect() const;
|
|
friend bool operator==( const QSRectf& r1, const QSRectf& r2 );
|
|
friend bool operator!=( const QSRectf& r1, const QSRectf& r2 );
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|