Vector getDiffuseDirection(Vector normal) { Vector axis; if(fabs(normal.x) < fabs(normal.y) && fabs(normal.x) < fabs(normal.z)) { axis = createVector(1, 0, 0); } else if (fabs(normal.y) < fabs(normal.z)) { axis = createVector(0, 1, 0); } else { axis = createVector(0, 0, 1); } Vector X = normalizeVector(crossVector(normal, axis)); Vector Y = normalizeVector(crossVector(normal, X)); float u = 0; float v = 0; float u_2 = 0; float v_2 = 0; do { u = (double)rand()/(double)RAND_MAX; v = (double)rand()/(double)RAND_MAX; u *= 2.0; u -= 1.0; v *= 2.0; v -= 1.0; u_2 = u * u; v_2 = v * v; } while((u_2 + v_2) >= 1); float w = sqrt(1 - (u_2) - (v_2)); Vector new_direction = addVectorByVector(multiplyVectorByNumber(X, u), addVectorByVector(multiplyVectorByNumber(Y, v), multiplyVectorByNumber(normal, w))); return new_direction; }
float distanceLinePoint(vector vline,vector pointOnLine , vector targetPoint) { return (modValue(crossVector(subVector(targetPoint,pointOnLine),multConstant(vline,1/modValue(vline))))); }