Exemple #1
0
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;
}
Exemple #2
0
float distanceLinePoint(vector vline,vector pointOnLine , vector targetPoint)
{	
	return (modValue(crossVector(subVector(targetPoint,pointOnLine),multConstant(vline,1/modValue(vline)))));
}