void drawCatmullRom(){ glColor3f(0.0f, 1.0f, 0.0f); glBegin(GL_LINE_STRIP); for (int i = 0; i < size; i++) { for (float t = 0; t <= (points[i + 1].time - points[i].time); t += (points[i + 1].time - points[i].time) / 100) { glVertex2f(Hermite(i, t).x, Hermite(i, t).y); } } glEnd(); }
Vector f(float t){ for(int i = 0; i < n; i++){ if(ts[i] <= t && t <= ts[i+1]) return Hermite(cps[i], vs[i], ts[i], cps[i+1],vs[i+1],ts[i+1],t); } return Vector(convertXToNorm(-2.0f),convertYToNorm(-2.0f)); }
// Interpolates between two values using a cubic equation. // value1: Source value. // value2: Source value. // amount: Weighting value. // Return: Interpolated value. float CMathHelper::SmoothStep(float value1, float value2, float amount) { // It is expected that 0 < amount < 1 // If amount < 0, return value1 // If amount > 1, return value2 float result = Clamp(amount, 0.0f, 1.0f); result = Hermite(value1, 0.0f, value2, 0.0f, result); return result; }
void Call_Hermite ( int n, int m ) { POLY a[n][m], a1[n][m]; POLY p[n][n], t[n][m]; dcmplx deter, dcmplx_p[n][n], x; int k; printf("1 random matrix.\n"); printf("2 input your own matrix.\n"); printf("Please choose the test matrix:"); scanf("%d", &k ); printf("%d\n\n", k ); if(k==1) random_matrix ( n, m, a); if(k==2) read_matrix( n, m, a ); printf("the original matrix generated :\n"); print(n,m,a); zero_matrix ( n, m, a1); I_matrix ( n, p); copy ( n, m, a, t); /* Eliminate_Col(n,m,a,p,0,0); */ /* Eliminate_Row(n,m,a,q,0,0); */ Hermite(n, m, a, p); printf("The hermite form of matrix a is :\n"); print(n,m,a); /* now begin to test the result */ Multiply ( n, n, m, p, t, a1 ); printf("The calculated hermite form with p*a is:\n"); print(n, m, a1); printf(" p is:\n"); print(n, n, p); x=create1(1.1); evaluate_matrix(n, n, p, dcmplx_p, x); deter=determinant(n, dcmplx_p); printf("The determinant of the p is: "); writeln_dcmplx(deter); }
//Display void display (void) { glClearColor(rosso_sf,verde_sf,blu_sf,0.0);//rendo variabili i parametri che mi definiscono il colore glClear(GL_COLOR_BUFFER_BIT); int i; glColor3f(0.0,0.0,1.0); glPointSize(dimpunto); glBegin(GL_POINTS);//per visualizzare anche i punti dove si clicca di colore blu for (i=1;i<=last;i++) glVertex2f(Punti[i].x,Punti[i].y); glEnd(); glColor3f(rosso_dis,verde_dis,blu_dis); glBegin(GL_LINE_STRIP); //poligono di controllo for (i=1;i<=last;i++) glVertex2f(Punti[i].x,Punti[i].y); glEnd(); n=last;//setto n al numero di punti disegnato for(i=1;i<=n;i++) w[i]=1;//metto tutti i pesi a 1 //scelta parametrizzazione if (scelta_param==0) { Parametrizzazione_Uniforme(); } else if(scelta_param==1) { Parametrizzazione_Corde(); } //scelta della funzione glPointSize(2);//la curva la disegno sempre di dimensione 2 if (metodo=='H' && last>1) { Hermite(); Disegna_Funzioni_Base(); } if (metodo=='B' && last>1) { if(mod_pesi_bez==1) w[i_p_b]=val_peso; Bezier(); if (subd==1) Subdivision(); if (d_el==1) Degree_Elevation(); Disegna_fBaseBernstein(); } if (metodo=='S' && last>3) { if(mod_pesi_spline==1) w[i_p_s]=val_pesos; Costruisci_Nodi(); Funzioni_Bspline(Nodi); De_Boor(); } //glutPostRedisplay();//è per questo che le funzioni base saltellano :)...se non lo metti però quando cambi il metodo non viene cambiato immediatamente ma dopo aver spinto un altro punto glFlush(); }
void draw() { if (numcp > 0) { //kör sugár 5m -> 0.01f for (int i = 0; i < numcp; i++) { glColor3f(1, 0, 0); glBegin(GL_TRIANGLE_FAN); glVertex2f(cp[i].x, cp[i].y); for (int j = 0; j < 360; j++) { //cos/sin (j*pi/180)*sugár+eltolás glVertex2f(cos(j * 3.14159 / 180.0) * 0.01 + cp[i].x, sin(j * 3.14159 / 180.0) * 0.01 + cp[i].y); } glEnd(); glColor3f(1, 1, 1); glBegin(GL_LINE_STRIP); for (int j = 0; j < 360; j++) { //cos/sin (j*pi/180)*sugár+eltolás glVertex2f(cos(j * 3.14159 / 180.0) * 0.01 + cp[i].x, sin(j * 3.14159 / 180.0) * 0.01 + cp[i].y); } glVertex2f(cos(0) * 0.01 + cp[i].x, sin(0) * 0.01 + cp[i].y); glEnd(); } } /* if (numcp > 1) { glColor3f(0, 0, 1); glBegin(GL_LINE_STRIP); for (int i = 0; i < numcp; i++) { glVertex2f(cp[i].x, cp[i].y); } glVertex2f(cp[0].x, cp[0].y); glEnd(); } */ if (numcp > 1) { glColor3f(1, 1, 1); glBegin(GL_LINE_STRIP); Vector v; for (int i = 0; i < numcp + 1; i++) { //cout<<i<<"\n"<<flush; for (float t = ido[i]; t < ido[i + 1]; t += 1.0f) { v = Hermite(i, t); if (parabola.isintersecting(v)) { // && !intersected) { intersectpoint = v; intersecttime = t; intersecti = i; intersected = true; } glVertex2f(v.x, v.y); } } glEnd(); if (intersected) { glColor3f(0, 0.7f, 0); //glBegin(GL_POINTS); //glVertex2f(intersectpoint.x, intersectpoint.y); //glEnd(); glBegin(GL_LINES); //for (float t = (ido[intersecti] - 100); t < ido[intersecti] + 100; t++) { v = Hermitederive(intersecti, intersecttime); v = v * (10/v.Length()); glVertex2f(intersectpoint.x + v.x, intersectpoint.y + v.y); glVertex2f(intersectpoint.x - v.x, intersectpoint.y - v.y); //} glEnd(); } } }
double past(int i, int interval, double t, int val) /* finds past values (val=1) or past derivatives (val=2)*/ { int j, jn, nq, ip; double t0, t1, y0, y1, dy0, dy1, res, hh; double *Yh; /* error checking */ if ( i >= n_eq) error("illegal input in lagvalue - var nr too high, %i", i+1); /* equal to current value... */ if ( interval == indexhist && t == histtime[interval]) { if (val == 1) res = histvar [interval * offset + i ]; else res = histdvar [interval * offset + i ]; /* within last interval - for now: just extrapolate last value */ } else if ( interval == indexhist && interpolMethod == 1) { if (val == 1) { t0 = histtime[interval]; y0 = histvar [interval * offset + i ]; dy0 = histdvar [interval * n_eq + i ]; res = y0 + dy0*(t-t0); } else res = histdvar [interval * n_eq + i ]; /* Hermite interpolation */ } else if (interpolMethod == 1) { j = interval; jn = nexthist(j); t0 = histtime[j]; t1 = histtime[jn]; y0 = histvar [j * n_eq + i ]; y1 = histvar [jn * n_eq + i ]; dy0 = histdvar [j * n_eq + i ]; dy1 = histdvar [jn * n_eq + i ]; if (val == 1) res = Hermite (t0, t1, y0, y1, dy0, dy1, t); else res = dHermite (t0, t1, y0, y1, dy0, dy1, t); /* dense interpolation - livermore solvers */ } else if (interpolMethod == 2) { j = interval; jn = nexthist(j); t0 = histtime[j]; t1 = histtime[jn]; nq = histord [j]; if (nq == 0) { y0 = histvar [j * offset + i ]; y1 = histvar [jn * offset + i ]; dy0 = histdvar [j * n_eq + i ]; dy1 = histdvar [jn * n_eq + i ]; if (val == 1) res = Hermite (t0, t1, y0, y1, dy0, dy1, t); else res = dHermite (t0, t1, y0, y1, dy0, dy1, t); } else { Yh = &histvar [j * offset]; hh = histhh[j]; res = interpolate(i+1, val-1, t0, hh, t, Yh, nq); } /* dense interpolation - radau - gets all values (i not used) */ } else { // if (val == 2) // error("radau interpol = 2 does not work for lagderiv"); j = interval; Yh = &histvar [j * offset]; histsave = &histvar [j * offset + 4*n_eq]; ip = i+1; F77_CALL(contr5alone) (&ip, &n_eq, &t, Yh, &offset, histsave, &res, &val); } return(res); }
ST Cardinal(ST y0, ST y1, ST y2, ST y3, FT c, FT t) { const FT m0 = c * (y2 - y0); //Tangent for y1. const FT m1 = c * (y3 - y1); //Tangent for y2. return Hermite(m0, y1, y2, m1, t); }
Vector3 CVector3::Hermite(Vector3 value1, Vector3 tangent1, Vector3 value2, Vector3 tangent2, float amount) { Vector3 result; Hermite(value1, tangent1, value2, tangent2, amount, result); return result; }
main() { short m; double abscis[N]; double wt[N]; double left, right; printf("Table 25.8, k= %1d, n=%1d\n\n", k, N); Jacobi(N, FLOATk, ZERO, abscis, wt); for (m=0; m<N; m++) wt[m] /= (k+1); for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.4, n=9\n\n"); Radau_Jacobi(4, -0.5, ZERO, abscis, wt, &left); left *= 2; for (m=0; m<4; m++) abscis[m]= sqrt(abscis[m]); printf("%2d %20.18g %20.18g\n", 0, ZERO, left); for (m=0; m<4; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.9, n= %1d\n\n", N); Laguerre(N, ZERO, abscis, wt); for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.10, n= %1d\n\n", N); Hermite(N, ZERO, abscis, wt); for (m=0; m<N; m++) wt[m] *= SqrtPI; for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nSame, n= %1d\n\n", 2*N); Even_Hermite(2*N, ZERO, abscis, wt); for (m=0; m<N; m++) wt[m] *= SqrtPI; for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nSame, n= %1d\n\n", 9); Odd_Hermite(9, ZERO, abscis, wt, &left); left *= SqrtPI; for (m=0; m<4; m++) wt[m] *= SqrtPI; printf("%2d %20.18g %20.18g\n", 0, ZERO, left); for (m=0; m<4; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.6, n= %1d\n\n", N+1); Lobatto_Jacobi(N-1, ZERO, ZERO, abscis, wt, &left, &right); for (m=0; m<(N-1); m++) wt[m] *= 2; left *= 2; right *= 2; for (m=0; m<(N-1); m++) abscis[m] = (2*abscis[m] - 1); printf(" %20.18g %20.18g\n", -1.0, left); for (m=0; m<(N-1); m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); printf(" %20.18g %20.18g\n", 1.0, right); }