void rotate(Points *p, Line axis, float degrees) { if (degrees == 0.0) return; float rads = degrees*M_PI/180.0; //float sign = (rads >= 0) ? -1.0 : 1.0; rads = fabs(rads); // Do not return points Point p1 = axis.a; Point p2 = axis.b; if (magnitude(p1) > magnitude(p2)) swap(p1, p2); Point d = unit_length(Line(p1, p2)); if (isnan(d.x) || isnan(d.y) || isnan(d.z)) return; float u = d.x; float v = d.y; float w = d.z; float a = p1.x; float b = p1.y; float c = p1.z; Matrix *M = new Matrix(4, 4); M->data()[0][0] = u*u + (v*v + w*w) * cos(rads); M->data()[0][1] = u*v*(1-cos(rads)) - w*sin(rads); M->data()[0][2] = u*w*(1-cos(rads)) + v*sin(rads); M->data()[0][3] = (a*(v*v + w*w) - u*(b*v + c*w))*(1-cos(rads)) + (b*w - c*v)*sin(rads); M->data()[1][0] = u*v*(1-cos(rads)) + w*sin(rads); M->data()[1][1] = v*v + (u*u + w*w)*cos(rads); M->data()[1][2] = v*w*(1-cos(rads)) - u*sin(rads); M->data()[1][3] = (b*(u*u + w*w) - v*(a*u + c*w))*(1-cos(rads)) + (c*u - a*w)*sin(rads); M->data()[2][0] = u*w*(1-cos(rads)) - v*sin(rads); M->data()[2][1] = v*w*(1-cos(rads)) + u*sin(rads); M->data()[2][2] = w*w + (u*u + v*v)*cos(rads); M->data()[2][3] = (c*(u*u + v*v) - w*(a*u + b*v))*(1-cos(rads)) + (a*v - b*u)*sin(rads); M->data()[3][0] = 0; M->data()[3][1] = 0; M->data()[3][2] = 0; M->data()[3][3] = 1; apply_transform(p, M); delete M; }
void jitter_view() { struct point eye, view, up, vdir, utemp, vtemp; eye.x = 2.0; eye.y = 2.0; eye.z = 2.0; view.x = JITTER*genrand(); view.y = JITTER*genrand(); view.z = JITTER*genrand(); up.x = 0.0; up.y = 1.0; up.z = 0.0; vdir.x = view.x - eye.x; vdir.y = view.y - eye.y; vdir.z = view.z - eye.z; // Calculate correct up vector as orthogonal to vdir and in the plane of // vdir and (0,1,0). vtemp = cross(vdir,up); utemp = cross(vtemp,vdir); up = unit_length(utemp); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(eye.x,eye.y,eye.z,view.x,view.y,view.z,up.x,up.y,up.z); }