All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions
SciFigs::CircleViewer::Limits Class Reference

#include <CircleViewer.h>

List of all members.

Public Member Functions

 Limits (const GraphContentOptions &gc)
bool polarLimits (const Ellipse &ell, double &startphi, double &stopphi) const

Constructor & Destructor Documentation

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());
  }

Member Function Documentation

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;
  }

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines