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