| 123 | } |
| 124 | |
| 125 | vector<Func> Spline::cal_fun(const vector<Point2f> &point_v) |
| 126 | { |
| 127 | vector<Func> func_v; |
| 128 | int n = point_v.size(); |
| 129 | if(n<=2) { |
| 130 | cout << "in cal_fun: point number less than 3" << endl; |
| 131 | return func_v; |
| 132 | } |
| 133 | |
| 134 | func_v.resize(point_v.size()-1); |
| 135 | |
| 136 | vector<double> Mx(n); |
| 137 | vector<double> My(n); |
| 138 | vector<double> A(n-2); |
| 139 | vector<double> B(n-2); |
| 140 | vector<double> C(n-2); |
| 141 | vector<double> Dx(n-2); |
| 142 | vector<double> Dy(n-2); |
| 143 | vector<double> h(n-1); |
| 144 | //vector<func> func_v(n-1); |
| 145 | |
| 146 | for(int i = 0; i < n-1; i++) |
| 147 | { |
| 148 | h[i] = sqrt(pow(point_v[i+1].x - point_v[i].x, 2) + pow(point_v[i+1].y - point_v[i].y, 2)); |
| 149 | } |
| 150 | |
| 151 | for(int i = 0; i < n-2; i++) |
| 152 | { |
| 153 | A[i] = h[i]; |
| 154 | B[i] = 2*(h[i]+h[i+1]); |
| 155 | C[i] = h[i+1]; |
| 156 | |
| 157 | Dx[i] = 6*( (point_v[i+2].x - point_v[i+1].x)/h[i+1] - (point_v[i+1].x - point_v[i].x)/h[i] ); |
| 158 | Dy[i] = 6*( (point_v[i+2].y - point_v[i+1].y)/h[i+1] - (point_v[i+1].y - point_v[i].y)/h[i] ); |
| 159 | } |
| 160 | |
| 161 | //TDMA |
| 162 | C[0] = C[0] / B[0]; |
| 163 | Dx[0] = Dx[0] / B[0]; |
| 164 | Dy[0] = Dy[0] / B[0]; |
| 165 | for(int i = 1; i < n-2; i++) |
| 166 | { |
| 167 | double tmp = B[i] - A[i]*C[i-1]; |
| 168 | C[i] = C[i] / tmp; |
| 169 | Dx[i] = (Dx[i] - A[i]*Dx[i-1]) / tmp; |
| 170 | Dy[i] = (Dy[i] - A[i]*Dy[i-1]) / tmp; |
| 171 | } |
| 172 | Mx[n-2] = Dx[n-3]; |
| 173 | My[n-2] = Dy[n-3]; |
| 174 | for(int i = n-4; i >= 0; i--) |
| 175 | { |
| 176 | Mx[i+1] = Dx[i] - C[i]*Mx[i+2]; |
| 177 | My[i+1] = Dy[i] - C[i]*My[i+2]; |
| 178 | } |
| 179 | |
| 180 | Mx[0] = 0; |
| 181 | Mx[n-1] = 0; |
| 182 | My[0] = 0; |
no test coverage detected