/* * Fibracion de Hopf, proyeccion de circulos de Hopf del hiperespacio CxC a CxR * esto es para mostrarselo a Ximena :) * compila * gcc -lm -lGL -lglut -lGLU hopf.c -o hopf * * beck@math.co.ro */ #include #include #include #include float rot = 0.0f; /* Vector en R4 */ typedef struct r4v { double x1, x2, x3, x4; } r4v_t; /* Vector en R3 */ typedef struct r3v { double x1, x2, x3; } r3v_t; /* Vector en CxR */ typedef struct crv { complex z; double x; } crv_t; /* Vector en CxC */ typedef struct c2v { complex z0, z1; } c2v_t; /* Identificamos RxRxRxR = R4 con el hiperespacio complejo CxC=C2 */ c2v_t r4v_a_c2v (r4v_t u) { c2v_t v; v.z0 = u.x1 + I * u.x2; v.z1 = u.x3 + I * u.x4; return v; } /* Identificamos RxRxR=R3 con el espacio de dimension 3 CxR */ crv_t r3v_a_crv (r3v_t u) { crv_t v; v.z = u.x1 + I * u.x2; v.x = u.x3; return v; } r3v_t crv_a_r3v (crv_t u) { r3v_t v; v.x1 = creal(u.z); v.x2 = cimag(u.z); v.x3 = u.x; return v; } /* Fibracion de Hopf rhoR:R4 |-> R3 */ r3v_t rhoR(r4v_t u) { r3v_t r; r.x1 = 2*((u.x1*u.x2)+(u.x3*u.x4)); r.x2 = 2*((u.x1*u.x4)-(u.x2*u.x3)); r.x3 = ((u.x1*u.x1)+(u.x3*u.x3))-((u.x2*u.x2)+(u.x4*u.x4)); return r; } /* Fibracion de Hopf rho:CxC |-> CxR */ crv_t rho (c2v_t u) { crv_t v; v.z = 2 * u.z0 * conj (u.z1); v.x = (cabs (u.z0) * cabs (u.z0)) - (cabs (u.z1) * cabs (u.z1)); return v; } r3v_t proy_estereografica_s3_r3(r4v_t u) { r3v_t r; r.x1 = u.x1/(u.x4-1); r.x2 = u.x2/(u.x4-1); r.x3 = u.x3/(u.x4-1); return r; } /* parametrizacion de la hiperesfera S3 psi y theta en [0,pi], phi en [0,2pi] */ r4v_t punto_s3 (double psi, double theta, double phi) { r4v_t z; z.x1 = cos (psi); z.x2 = sin (psi) * cos (theta); z.x3 = sin (psi) * sin (theta) * cos (phi); z.x4 = sin (psi) * sin (theta) * sin (phi); return z; } /* Imprime vector de R4 */ void print_r4v (r4v_t v) { printf ("(%.2f,%.2f,%.2f,%.2f)\n", v.x1, v.x2, v.x3, v.x4); return; } /* Imprime vector de R3 */ void print_r3v (r3v_t v) { printf ("(%.2f,%.2f,%.2f)\n", v.x1, v.x2, v.x3); return; } /* Imprime vector de C2 */ void print_c2v (c2v_t v) { printf ("(%.2f+%.2fi,%.2f+%.2fi)\n", creal (v.z0), cimag (v.z0), creal (v.z1), cimag (v.z1)); return; } /* Imprime vector de CxR */ void print_crv (crv_t v) { printf ("(%.2f+%.2fi,%.2f)\n", creal (v.z), cimag (v.z), v.x); return; } r3v_t prod_escalar(double k, r3v_t u) { r3v_t r; r.x1 = u.x1*k; r.x2 = u.x2*k; r.x3 = u.x3*k; return r; } void display (void) { double psi,theta,phi; r4v_t p,q; c2v_t z; crv_t w; r3v_t h,f; double k=2.5,d,v; psi=theta=phi=0; glLoadIdentity (); glTranslatef (1.5f, 0.0f, -7.0f); glRotatef (rot, 1.0f, 1.0f, 1.0f); glClear (GL_COLOR_BUFFER_BIT); glBegin (GL_POINTS); theta=1; phi=1.5; psi=0.71; for(psi=0.0;psi