circle.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <cmath>
00026 #include <models/shape/circle.h>
00027
00028 using namespace std;
00029 using namespace fawkes;
00030
00031
00032
00033
00034
00035
00036 Circle::Circle()
00037 {
00038 center.x=center.y=0.0f;
00039 radius = -1.0f;
00040 count = 0;
00041 }
00042
00043
00044
00045
00046
00047
00048 Circle::Circle(const center_in_roi_t& c, float r, int n)
00049 {
00050 center = c;
00051 radius = r;
00052 count = n;
00053 }
00054
00055
00056
00057
00058 void
00059 Circle::printToStream(std::ostream &stream)
00060 {
00061 stream << "center=(" << center.x << "," << center.y << ")"
00062 << " radius=" << radius << " count= " << count;
00063 }
00064
00065
00066
00067
00068
00069 void
00070 Circle::fitCircle (vector< point_t > &points)
00071 {
00072
00073 double A00=0.0, A01=0.0, A02=0.0;
00074 double A10=0.0, A11=0.0, A12=0.0;
00075 double A20=0.0, A21=0.0, A22=0.0;
00076 double b0 =0.0, b1 =0.0, b2 =0.0;
00077
00078
00079 int count = points.size();
00080 for (int i = 0; i < count; i++)
00081 {
00082 point_t &t = points[i];
00083 double x0 = 2.0f * t.x;
00084 double y0 = 2.0f * t.y;
00085 double b = (double)(t.x * t.x + t.y * t.y);
00086 A00 += x0 * x0;
00087 A01 += x0 * y0;
00088 A02 += x0;
00089 A10 += y0 * x0;
00090 A11 += y0 * y0;
00091 A12 += y0;
00092 A20 += x0;
00093 A21 += y0;
00094 A22 += 1.0;
00095 b0 += x0 * b;
00096 b1 += y0 * b;
00097 b2 += b;
00098 }
00099
00100
00101 double delta = + A00 * A11 * A22 + A01 * A12 * A20 + A02 * A10 * A21
00102 - A00 * A12 * A21 - A01 * A10 * A22 - A02 * A11 * A20;
00103 center.x = (float)( ( + b0 * A11 * A22 + A01 * A12 * b2 + A02 * b1 * A21
00104 - b0 * A12 * A21 - A01 * b1 * A22 - A02 * A11 * b2 ) / delta);
00105 center.y = (float)( ( + A00 * b1 * A22 + b0 * A12 * A20 + A02 * A10 * b2
00106 - A00 * A12 * b2 - b0 * A10 * A22 - A02 * b1 * A20 ) / delta);
00107 radius = (float)sqrt( ( + A00 * A11 * b2 + A01 * b1 * A20 + b0 * A10 * A21
00108 - A00 * b1 * A21 - A01 * A10 * b2 - b0 * A11 * A20 ) / delta
00109 + center.x * center.x + center.y * center.y);
00110 count = points.size();
00111 }
00112
00113
00114 void
00115 Circle::setMargin( unsigned int margin )
00116 {
00117 this->margin = margin;
00118 }
00119
00120
00121 bool
00122 Circle::isClose( unsigned int in_roi_x, unsigned int in_roi_y )
00123 {
00124 float dx = in_roi_x - center.x;
00125 float dy = in_roi_y - center.y;
00126
00127 float dist = sqrt( dx * dx + dy * dy );
00128
00129 return ( (dist <= (radius + margin)) &&
00130 (dist >= (radius - margin)) );
00131
00132 }