void makePositiveLeadingCoeff(Polynomial *polynomial) { assert(polynomial->deg != DISPOSED_POLYNOMIAL_DEG); if (polynomial->coeffs[polynomial->deg] < 0.0) { multiplyByScalar(polynomial, -1.0); } }
//-------------------------------------------------------------- //Making image morphing void testApp::updateMorph( float morphValue, int morphImageIndex ) { mapX.allocate( w, h ); //w and h is size of gray1 image mapY.allocate( w, h ); //Get pointers to pixels data float *flowXPixels = flowX.getPixelsAsFloats(); float *flowYPixels = flowY.getPixelsAsFloats(); float *mapXPixels = mapX.getPixelsAsFloats(); float *mapYPixels = mapY.getPixelsAsFloats(); for (int y=0; y<h; y++) { for (int x=0; x<w; x++) { int i = x + w * y; //pixels' index mapXPixels[ i ] = x + flowXPixels[ i ] * morphValue; mapYPixels[ i ] = y + flowYPixels[ i ] * morphValue; } } mapX.flagImageChanged(); //Notify that pixels values were changed mapY.flagImageChanged(); inverseMapping( mapX, mapY ); //Create big maps int W = color1.width; int H = color1.height; if ( !bigMapX.bAllocated ) { bigMapX.allocate( W, H ); bigMapY.allocate( W, H ); } //bigMapX and bigMapY have type ofxCvFloatImage bigMapX.scaleIntoMe( mapX, CV_INTER_LINEAR ); bigMapY.scaleIntoMe( mapY, CV_INTER_LINEAR ); multiplyByScalar( bigMapX, 1.0 * W / w ); multiplyByScalar( bigMapY, 1.0 * H / h ); //Do warping //Select image to morph if ( morphImageIndex == 1 ) { morph = color1; //First input image } else { morph = colorTest; //Checkerboard image } morph.remap( bigMapX.getCvImage(), bigMapY.getCvImage() ); }
void makeLagrangePolynomial(Polynomial *polynomial, Table const *table) { size_t const size = table->xs.size; initPolynomial(polynomial, size - 1); setToScalar(polynomial, 0.0); Polynomial term; initPolynomial(&term, polynomial->deg); for (size_t k = 0; k < size; ++k) { setToScalar(&term, 1.0); for (size_t j = 0; j < size; ++j) { if (j != k) { addRoot(&term, table->xs.values[j]); } } long double denominator = 1.0; long double const xk = table->xs.values[k]; for (size_t j = 0; j < size; ++j) { denominator *= (j == k ? 1.0 : xk - table->xs.values[j]); } multiplyByScalar(&term, table->ys.values[k] / denominator); addPolynomial(polynomial, &term); } disposePolynomial(&term); }