All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
#include <CircleViewer.h>
Public Member Functions | |
Limits (const GraphContentOptions &gc) | |
bool | polarLimits (const Ellipse &ell, double &startphi, double &stopphi) const |
SciFigs::CircleViewer::Limits::Limits | ( | const GraphContentOptions & | gc | ) |
References QGpCoreTools::Segment2D::set(), QGpCoreTools::Rect::setLimits(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), TRACE, QGpCoreTools::Point2D::x(), SciFigs::GraphContentOptions::xVisMax(), SciFigs::GraphContentOptions::xVisMin(), QGpCoreTools::Point2D::y(), SciFigs::GraphContentOptions::yVisMax(), and SciFigs::GraphContentOptions::yVisMin().
{ TRACE; // We call _a,_b,_c,_d the four corners of the visible area _a.setX(gc.xVisMin()); _a.setY(gc.yVisMin()); _b.setX(gc.xVisMin()); _b.setY(gc.yVisMax()); _c.setX(gc.xVisMax()); _c.setY(gc.yVisMax()); _d.setX(gc.xVisMax()); _d.setY(gc.yVisMin()); _ab.set(_a, _b); _bc.set(_b, _c); _cd.set(_c, _d); _da.set(_d, _a); _visLimits.setLimits(_a.x(), _a.y(), _c.x(), _c.y()); }
bool SciFigs::CircleViewer::Limits::polarLimits | ( | const Ellipse & | ell, |
double & | startphi, | ||
double & | stopphi | ||
) | const |
References QGpCoreTools::Point2D::azimuthTo(), QGpCoreTools::Ellipse::center(), QGpCoreTools::Ellipse::majorRadius(), and TRACE.
Referenced by SciFigs::CircleMask::paintData(), and SciFigs::CircleViewer::paintData().
{ TRACE; startphi=0; stopphi=2*M_PI; // TODO: include elliptical shape and orientation double r=ell.majorRadius(); // First test if at least one arc is visible double minR, maxR, dist; // look for the max distance to corners maxR=_a.distanceTo(ell.center()); dist=_b.distanceTo(ell.center()); if(dist > maxR) maxR=dist; dist=_c.distanceTo(ell.center()); if(dist > maxR) maxR=dist; dist=_d.distanceTo(ell.center()); if(dist > maxR) maxR=dist; minR=maxR; if(_visLimits.includes(ell.center()) ) { if(r>maxR) return false; else return true; } else { // look for min and max to segments dist=_ab.distanceTo(ell.center()); if(dist<minR) minR=dist; else if(dist > maxR) maxR=dist; dist=_bc.distanceTo(ell.center()); if(dist<minR) minR=dist; else if(dist > maxR) maxR=dist; dist=_cd.distanceTo(ell.center()); if(dist<minR) minR=dist; else if(dist > maxR) maxR=dist; dist=_da.distanceTo(ell.center()); if(dist<minR) minR=dist; else if(dist > maxR) maxR=dist; //printf ("r=%lg rmin=%lg rmax=%lg\n",r,minR, maxR); if(r < minR || r > maxR) return false; // Find angular limits // init with point a double az0=ell.center().azimuthTo(_a); startphi=az0; stopphi=az0; // add point b double az=ell.center().azimuthTo(_b); double daz=az - az0; if(daz > M_PI) daz=2 * M_PI - daz; if(daz < -M_PI) daz=2 * M_PI + daz; az=az0 + daz; if(az > stopphi) stopphi=az; else if(az < startphi) startphi=az; // add point c az=ell.center().azimuthTo(_c); daz=az - az0; if(daz > M_PI) daz=2 * M_PI - daz; if(daz < -M_PI) daz=2 * M_PI + daz; az=az0 + daz; if(az > stopphi) stopphi=az; else if(az < startphi) startphi=az; // add point d az=ell.center().azimuthTo(_d); daz=az - az0; if(daz > M_PI) daz=2 * M_PI - daz; if(daz < -M_PI) daz=2 * M_PI + daz; az=az0 + daz; if(az > stopphi) stopphi=az; else if(az < startphi) startphi=az; } return true; }