Go to the documentation of this file.00001 #include "CircleFromThreePoints.h"
00002
00003 CircleFromThreePoints::CircleFromThreePoints( const GlobalPoint& inner,
00004 const GlobalPoint& mid,
00005 const GlobalPoint& outer,
00006 double precision)
00007 {
00008
00009 Vector2D b( mid.x()-inner.x(), mid.y()-inner.y());
00010 Vector2D c( outer.x()-inner.x(), outer.y()-inner.y());
00011 init( b, c, Vector2D( inner.x(), inner.y()), precision);
00012 }
00013
00014 void CircleFromThreePoints::init( const Vector2D& b, const Vector2D& c,
00015 const Vector2D& offset, double precision)
00016 {
00017 double b2 = b.mag2();
00018 double c2 = c.mag2();
00019
00020 double oX(0), oY(0);
00021 bool solved = false;
00022 if (fabs(b.x()) > fabs(b.y())) {
00023 double k = c.x()/b.x();
00024 double div = 2*(k*b.y() - c.y());
00025 if (fabs(div) < precision) theCurvature = 0;
00026 else {
00027 oY = (k*b2 - c2) / div;
00028 oX = b2/(2*b.x()) - b.y()/b.x() * oY;
00029 solved = true;
00030 }
00031 }
00032 else {
00033 double k = c.y()/b.y();
00034 double div = 2*(k*b.x()-c.x());
00035 if (fabs(div) < precision) theCurvature = 0;
00036 else {
00037 oX = (k*b2 - c2) / div;
00038 oY = b2/(2*b.y()) - b.x()/b.y() * oX;
00039 solved = true;
00040 }
00041 }
00042 if (solved) {
00043 theCurvature = 1./sqrt(oX*oX + oY*oY);
00044 double xC = oX + offset.x();
00045 double yC = oY + offset.y();
00046 theCenter = Vector2D( xC, yC);
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 }
00061 }
00062