/* * Test 1 * */ void provaCalcS(){ printf("halloo, probando probando!!\n"); vector pc = zerov(2); vector pcPrimes = zerov(2); matrix S = zerom(2, 3); pc.v[0] = 50; pc.v[1] = 200; //Test in matlab //S = [ 0 0.0003495 0.002; 0.0018 0.0338 0.0207]; S.m[0][0] = 0; S.m[0][1] = 0.0003495; S.m[0][2] = 0.002; S.m[1][0] = 0.0018; S.m[1][1] = 0.0338; S.m[1][2] = 0.0207; int numPrimes = (int)(pc.v[pc.x - 1] / pc.v[0]); intvector numsPrimesReason = primes(numPrimes); int i, j; for(i = 0; i < numsPrimesReason.x; ++i){ printf("i: %d\n", numsPrimesReason.v[i]); int primeNum = numsPrimesReason.v[i]; for(j = 0; j < pcPrimes.x; ++j){ pcPrimes.v[j] = pc.v[j] * primeNum; } printf("\nArray pcPrimes:\n"); printv(pcPrimes); matrix SnInterp = interp1Mat(pc, pcPrimes, S, 0); printf("\nResult S\n"); printm(SnInterp); } }
/* * Test 2 * Esta dando diferente el valor yN[0] = 0.012, cuando en matlab da yN[0] = 0.01 .0 * */ void interpVectorTest(){ vector xO = zerov(2); xO.v[0] = 50; xO.v[1] = 200; vector yO = zerov(2); yO.v[0] = 0; yO.v[1] = 0.0018; vector xN = zerov(2); xN.v[0] = 150; xN.v[1] = 600; vector yN = zerov(2); interp1(xO, yO, xN, yN.v); printf("yN:\n"); printv(yN); double yNcurr = interp(xO.v, yO.v, 150, 0); printf("Numero interpolado yNCurr: %f", yNcurr); }
double* new_zero_vector(unsigned int n) { double *v; v = new_vector(n); zerov(v, n); return v; }
static void BuildCurves(float3* points, int count, bool isClosed, std::vector<BezierCurve>* out) { assert(count > 1); float3 cp[4]; if(count == 2) { cp[0] = points[0]; cp[3] = points[1]; cp[1] = cp[0] + 0.3333f * (cp[3] - cp[0]); cp[2] = cp[0] + 0.6666f * (cp[3] - cp[0]); out->push_back(BezierCurve(cp)); } else { float3 zerov(0.0f,0.0f,0.0f); std::vector<float3> tangents(count,zerov); CalcPointTangents(points,&tangents[0],count,isClosed); for (int i = 1; i < count; i++) { float3 chord = points[i] - points[i - 1]; float segLen = length(chord) * 0.3333f; cp[0] = points[i - 1]; cp[3] = points[i]; float3 tangent1 = tangents[i - 1]; if (dot(chord, tangent1) < 0) tangent1 = -tangent1; cp[1] = cp[0] + (tangent1 * segLen); float3 tangent2 = tangents[i]; if (dot(-chord, tangent2) < 0) tangent2 = -tangent2; cp[2] = cp[3] + (tangent2 * segLen); BezierCurve curve(cp); out->push_back(curve); } // Calculate last curve if is closed if (isClosed) { float3 lastcp1 = cp[1]; float3 lastcp2 = cp[2]; cp[0] = points[count - 1]; cp[3] = points[0]; BezierCurve lastCurve = out->back(); float tanLen = length(cp[3] - cp[0]) * 0.3333f; float3 v = normalize(lastCurve.GetControlPoint(2) - cp[0]); cp[1] = cp[0] - (v * tanLen); BezierCurve firstCurve = out->front(); v = normalize(firstCurve.GetControlPoint(1) - cp[3]); cp[2] = cp[3] - (v * tanLen); BezierCurve curve(cp); out->push_back(curve); } } }