//Creates a full patch for one frequency. Calculates gradientpoints, and interpolates values for all pixels between them
vector<float> PerlinPatchGenerator::createPatch(int frequency, int gradientPoints, float amplitude){
    
    float s,t,u,v,diffX,diffY,a,b,z;
    int gradientX, gradientY;
    vector<float> finalGrid;
    float sVec[2], tVec[2], uVec[2], vVec[2];

	vector<vector<float>> gradients;
	gradients = createGradients(gradientPoints);
    
    //Number of pixels included between each gradient point
    int numberOfPixels = gridSize/frequency;    
    

    //Loop over all pixels in patch
	for(int row = 0; row < gridSize; row++) {
		//Calculate distance from pixel to closest gradient point in Y-axis
        diffY = (float)(row % numberOfPixels)/(float)numberOfPixels;

		for(int col = 0; col < gridSize; col++) {
    		//Calculate distance from pixel to closest gradient point in X-axis
			diffX = (float)(col % numberOfPixels)/(float)numberOfPixels;            

            //Check what gradientpoints we should interpolate values from
			gradientX = floor(col/numberOfPixels);
			gradientY = floor(row/numberOfPixels);

            //Calculate vectors from each gradientpoint to the pixel
            sVec[0] = diffX;
            sVec[1] = diffY;
            tVec[0] = diffX-1;
            tVec[1] = diffY;
            uVec[0] = diffX;
            uVec[1] = diffY-1;
            vVec[0] = diffX-1;
            vVec[1] = diffY-1;

            //Calculate values to interpolate between for each pixel
            s = dotProduct(gradients.at(gradientY*gradientPoints + gradientX),sVec);
            t = dotProduct(gradients.at(gradientY*gradientPoints + gradientX+1),tVec);
            u = dotProduct(gradients.at((gradientY+1)*gradientPoints + gradientX),uVec);
            v = dotProduct(gradients.at((gradientY+1)*gradientPoints + gradientX+1),vVec);

            //Interpolate in x-axis and y-axis
            a = interpolateValues(s,t,diffX); 
            b = interpolateValues(u,v,diffX);
            z = interpolateValues(a,b,diffY);;
            
			finalGrid.push_back(z * amplitude);
            
		} 
	}   
	return finalGrid;	
}
vector<float> PerlinPatchGenerator::createPatch(int gridSize, int frequency, int gradientPoints, float amplitude){
    cout << "createPatch begin\n";

	vector<vector<float>> gradients;
	gradients = createGradients(gradientPoints);

    int numberOfPixels = gridSize/frequency;
    float s,t,u,v,diffX,diffY,Sx,Sy,a,b,z,ft,f;
    int gradientX, gradientY;
    vector<float> finalGrid;

	for(int row = 0; row < gridSize; row++) {
		diffY = (float)(row % numberOfPixels)/(float)numberOfPixels;

		for(int col = 0; col < gridSize; col++) {
			diffX = (float)(col % numberOfPixels)/(float)numberOfPixels;            

			gradientX = floor(col/numberOfPixels);
			gradientY = floor(row/numberOfPixels);

            vector<float> sVec, tVec, uVec, vVec;
            sVec.push_back(diffX);
            sVec.push_back(diffY);
            tVec.push_back(diffX-1);
            tVec.push_back(diffY);
            uVec.push_back(diffX);
            uVec.push_back(diffY-1);
            vVec.push_back(diffX-1);
            vVec.push_back(diffY-1);

            s = dotProduct(gradients.at(gradientY*gradientPoints + gradientX),sVec);
            t = dotProduct(gradients.at(gradientY*gradientPoints + gradientX+1),tVec);
            u = dotProduct(gradients.at((gradientY+1)*gradientPoints + gradientX),uVec);
            v = dotProduct(gradients.at((gradientY+1)*gradientPoints + gradientX+1),vVec);

            a = interpolateValues(s,t,diffX); 
            b = interpolateValues(u,v,diffX);
            z = interpolateValues(a,b,diffY);;
            
            
            
			finalGrid.push_back(z * amplitude);
             

		} 
	}
    cout << "createPatch end\n";

	return finalGrid;	
}