CMS 3D CMS Logo

Public Types | Public Member Functions | Private Member Functions | Private Attributes

CircleFromThreePoints Class Reference

#include <CircleFromThreePoints.h>

List of all members.

Public Types

typedef Basic2DVector< float > Vector2D

Public Member Functions

Vector2D center () const
 CircleFromThreePoints (const GlobalPoint &inner, const GlobalPoint &mid, const GlobalPoint &outer, double precision=1.e-7)
 CircleFromThreePoints ()
 dummy
float curvature () const

Private Member Functions

void init (const Vector2D &b, const Vector2D &c, const Vector2D &offset, double precision)

Private Attributes

Vector2D theCenter
float theCurvature

Detailed Description

Computes the curvature (1/radius) and, if possible, the center of the circle passing through three points. The input points are three dimensional for convenience, but the calculation is done in the transverse (x,y) plane. No verification of the reasonableness of the z coordinate is done. If the three points lie on a line the curvature is zero and the center position is undefined. The 3 points are assumed to make sense: if the distance between two of them is very small compared to the ditance to the third the result will be numerically unstable.

Definition at line 18 of file CircleFromThreePoints.h.


Member Typedef Documentation

Definition at line 24 of file CircleFromThreePoints.h.


Constructor & Destructor Documentation

CircleFromThreePoints::CircleFromThreePoints ( ) [inline]

dummy

Definition at line 22 of file CircleFromThreePoints.h.

{}
CircleFromThreePoints::CircleFromThreePoints ( const GlobalPoint inner,
const GlobalPoint mid,
const GlobalPoint outer,
double  precision = 1.e-7 
)

Construct from three points (see class description). The order of points is not essential, but accuracy should be better if the second point lies between the other two on the circle. The optional argument "precision" specifies how accurately the straight line check has to be satisfied for setting the curvature to zero and the center position to "undefined".

Definition at line 3 of file CircleFromThreePoints.cc.

References b, trackerHits::c, init(), PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

{
  // move to frame where inner.x() == inner.y() == 0;
  Vector2D b( mid.x()-inner.x(), mid.y()-inner.y());
  Vector2D c( outer.x()-inner.x(), outer.y()-inner.y());
  init( b, c, Vector2D( inner.x(), inner.y()), precision);
}

Member Function Documentation

Vector2D CircleFromThreePoints::center ( ) const [inline]

returns the position of the center of the circle. If curvature is zero, center() throws an exception to avoid use of undefined position. If the curvature is very small the position of the center will be very inaccurate.

Definition at line 52 of file CircleFromThreePoints.h.

References theCenter.

Referenced by ClusterShapeTrackFilter::getGlobalDirs(), TrackFitter::run(), PixelFitterByHelixProjections::run(), and KFBasedPixelFitter::run().

{ return theCenter; }  
float CircleFromThreePoints::curvature ( ) const [inline]

Returns the curvature (1/radius), in cm^(-1). The curvature is precomputed, this is just access method (takes no time). If curvature is zero the center is undefined (see description of presicion above).

Definition at line 44 of file CircleFromThreePoints.h.

References theCurvature.

Referenced by ClusterShapeTrackFilter::getGlobalDirs(), TrackFitter::run(), PixelFitterByHelixProjections::run(), and KFBasedPixelFitter::run().

{ return theCurvature;}
void CircleFromThreePoints::init ( const Vector2D b,
const Vector2D c,
const Vector2D offset,
double  precision 
) [private]

Definition at line 14 of file CircleFromThreePoints.cc.

References gen::k, Basic2DVector< T >::mag2(), mathSSE::sqrt(), theCenter, theCurvature, Basic2DVector< T >::x(), and Basic2DVector< T >::y().

Referenced by CircleFromThreePoints().

{
  double b2 = b.mag2();
  double c2 = c.mag2();

  double oX(0), oY(0);
  bool solved = false;
  if (fabs(b.x()) > fabs(b.y())) {    // solve for y first
    double k = c.x()/b.x();
    double div = 2*(k*b.y() - c.y());
    if (fabs(div) < precision) theCurvature = 0;  // if the 3 points lie on a line
    else {
      oY = (k*b2 - c2) / div;
      oX = b2/(2*b.x()) - b.y()/b.x() * oY;
      solved = true;
    }
  }
  else {    // solve for x first
    double k = c.y()/b.y();
    double div = 2*(k*b.x()-c.x());
    if (fabs(div) < precision) theCurvature = 0;  // if the 3 points lie on a line
    else {
      oX = (k*b2 - c2) / div;
      oY = b2/(2*b.y()) - b.x()/b.y() * oX;
      solved = true;
    }
  }
  if (solved) {
    theCurvature = 1./sqrt(oX*oX + oY*oY);
    double xC = oX + offset.x();
    double yC = oY + offset.y();
    theCenter = Vector2D( xC, yC);
    //    thePhi = acos(xC/sqrt(xC*xC + yC*yC));

    //    if (xC<0.) thePhi = thePhi - PI;
    //    cout << setiosflags(ios::showpoint | ios::fixed);
    //
    //    cout << "CircleFromThreePoints::init curv = " << theCurvature << endl;
    //    cout << "CircleFromThreePoints::init center prime = " << oX << " " << oY << endl;
    //    cout << "CircleFromThreePoints::init offset = " << offset.x() << " " << offset.y() << endl;
    //    cout << "CircleFromThreePoints::init center = " << theCenter.x()<< " " << theCenter.y() << endl;
    //
    //    float d = sqrt(theCenter.x()*theCenter.x()+theCenter.y()*theCenter.y());
    //    cout << "CircleFromThreePoints::init dfloat = " << setw(10) << setprecision(5) << d << endl;
    //    cout << "CircleFromThreePoints::init radius = " << 1/theCurvature << endl;
  }
}

Member Data Documentation

Definition at line 57 of file CircleFromThreePoints.h.

Referenced by center(), and init().

Definition at line 56 of file CircleFromThreePoints.h.

Referenced by curvature(), and init().