====== Zobrazování 2D spline křivek ====== [[http://www.flickr.com/photos/pitel/2368322289/|{{ http://farm4.static.flickr.com/3282/2368322289_7066462d14_o.png }}]] ===== student.cpp ===== /////////////////////////////////////////////////////////////////////////////// // Soubor studentskych funkci /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // include #include "main.h" #include #include #include /////////////////////////////////////////////////////////////////////////////// // name spaces using namespace std; //Mocnina double Power(double a, int b) { double result = 1.0; for (int i = 0; i < b; ++i) { result *= a; } return result; } /////////////////// ZDE DOPLNTE IMPLEMENTACI ZA DOMACI UKOL //////////////////// double N(int i, int k, double t, const K_NOT & U) { double b; if (k == 0) { if ((t >= U[i]) && (t < U[i + 1])) { return 1.0; } return 0.0; } if (!EQUAL_ZERO(U[i + k] - U[i])) { b = (t - U[i]) / (U[i + k] - U[i]) * N(i, k - 1, t, U); } if (!EQUAL_ZERO(U[i + k + 1] - U[i + 1])) { b += (U[i + k + 1] - t) / (U[i + k + 1] - U[i + 1]) * N(i + 1, k - 1, t, U); } return b; } void BSpline(int quality, const T_PointVector & points, T_PointVector & line_points , const BSplineDescription & bsplinedsc) { double t; int k; double step = 1.0 / quality; for (k = 0, t = 0.0; k <= quality; k++, t += step) { if (t >= 1.0) { t = 0.9; } int i; double p; double x; double y; for (i = 0, x = y = p = 0.0; i <= bsplinedsc.n; i++) { double b = points[i].weight * N(i, bsplinedsc.k, t, bsplinedsc.U); x += points[i].x * b; y += points[i].y * b; p += b; } if (EQUAL_ZERO(p)) { x = y = 0.0; } else { x /= p; y /= p; } line_points.push_back(S_Point(x, y)); } } ////////////////////////////////////////////////////////////////////////////////