#include #include #include #include "writemesh.h" void surface (double u, double v, struct point *p) { double z, ro, ron; double bb; double sinu, sinv, cosu, cosv, bp, v1, v2, v3, w1, w2, w3; switch (ifun) { case F_TORUS: /* toro standard */ z = b*sin(v); ron = b*cos(v); ro = a + ron; p->n[2] = p->p[2] = z; p->n[0] = ron*cos(u); p->n[1] = ron*sin(u); p->p[0] = ro*cos(u); p->p[1] = ro*sin(u); break; case 2: /* toro con strozzatura */ sinu = sin(u); cosu = cos(u); sinv = sin(v); cosv = cos(v); bb = b - c*sinu; z = bb*sinv; ro = a + bb*cosv; p->p[0] = ro*cosu; p->p[1] = ro*sinu; p->p[2] = z; bp = - c*cosu; v1 = bp*cosu*cosv - ro*sinu; v2 = bp*sinu*cosv + ro*cosu; v3 = bp*sinv; w1 = - sinv*cosu; w2 = - sinv*sinu; w3 = cosv; p->n[0] = v2*w3 - v3*w2; //ron*cosu; p->n[1] = v3*w1 - v1*w3; //ron*sinu; p->n[2] = v1*w2 - v2*w1; //z; break; default: printf ("Invalid ifun choice: %d\n", ifun); exit (1); } return; }