| 234 | } |
| 235 | |
| 236 | CurvePoint getCurvePoint( const CurvePoints& cp, const std::vector<float> & lens, float p ) |
| 237 | { |
| 238 | assert( cp.size() == lens.size() ); |
| 239 | assert( cp.size() >= 2 ); |
| 240 | CurvePoint res; |
| 241 | if ( p <= lens.front() ) |
| 242 | { |
| 243 | // extrapolate |
| 244 | res = cp.front(); |
| 245 | res.pos += ( p - lens.front() ) * res.dir; |
| 246 | return res; |
| 247 | } |
| 248 | if ( p >= lens.back() ) |
| 249 | { |
| 250 | // extrapolate |
| 251 | res = cp.back(); |
| 252 | res.pos += ( p - lens.back() ) * res.dir; |
| 253 | return res; |
| 254 | } |
| 255 | // interpolate |
| 256 | auto i = std::lower_bound( lens.begin(), lens.end(), p ) - lens.begin(); |
| 257 | assert( lens[i] >= p ); |
| 258 | if ( lens[i] == p ) |
| 259 | return cp[i]; |
| 260 | assert( lens[i-1] < p ); |
| 261 | auto f = ( p - lens[i-1] ) / ( lens[i] - lens[i-1] ); |
| 262 | res = CurvePoint |
| 263 | { |
| 264 | .pos = lerp( cp[i-1].pos, cp[i].pos, f ), |
| 265 | .dir = lerp( cp[i-1].dir, cp[i].dir, f ), |
| 266 | .snorm = lerp( cp[i-1].snorm, cp[i].snorm, f ) |
| 267 | }; |
| 268 | return res; |
| 269 | } |
| 270 | |
| 271 | Expected<CurveFunc> curveFromPoints( const CurvePoints& cp, float* outCurveLen ) |
| 272 | { |
no test coverage detected