void CircleCurve::setRadius(float x) { m_radius = x; const float delta = PI / 18.f; float a, b, r; for(int i = 0; i < 37; i++) { if(m_eccentricity > 0.f && m_eccentricity < 1.f) { a = m_radius; b = sqrt( 1.f - m_eccentricity * m_eccentricity) * a; r = a * b / sqrt(a * a * cos(delta * i) * cos(delta * i) + b * b * sin(delta * i) * sin(delta * i)); } else r = m_radius; m_cvs[i].set(sin(delta * i) * r, cos(delta * i) * r, 0.f); } computeKnots(); }
BSpline::BSpline(int m, int n, int resolution, BSPoint *control) :n_control_points(m), n_degree(n), knots(std::vector<int>(m+n+2, 0)), curve(new CvPoint[resolution]) { double increment, interval; BSPoint tmp_point; int output_index; computeKnots(); increment = (double) (m - n + 1)/(resolution - 1); // why ? interval = 0; for (output_index = 0; output_index < resolution - 1; ++output_index){ computePoint(control, &tmp_point, interval); curve[output_index].x = round(tmp_point.x); curve[output_index].y = round(tmp_point.y); interval += increment; } curve[resolution-1].x=control[m].x; curve[resolution-1].y=control[m].y; }