diff --git a/utils/geom.c b/utils/geom.c index 5fd6562..cc7f7ac 100644 --- a/utils/geom.c +++ b/utils/geom.c @@ -2190,28 +2190,6 @@ boolean point_in_polygon(double px, double py, vector3 *vertices, int num_vertic return num_side_intersections%2; } -void add_to_list(double s, double *slist, int length) -{ - switch(length) - { case 0: - slist[0] = s; - break; - case 1: - if (s>=slist[0]) - slist[1]=s; - else - { slist[1]=slist[0]; slist[0]=s; } - break; - default: - if (s1.0e-6), "degenerate plane in normal_to_plane" ); matrix3x3 M; M.c0 = v1; M.c1 = v2; - M.c2 = vector3_scale(-1.0, v3); - vector3 tus = matrix3x3_vector3_mult(matrix3x3_inverse(M),RHS); - return vector3_scale(-1.0*tus.z, v3); + M.c2 = v3; + vector3 RHS = vector3_minus(p,o); + vector3 tus = matrix3x3_vector3_mult(matrix3x3_inverse(M),RHS); // "t, u, s" + *s = tus.z; + return v3; } /***************************************************************/ @@ -2370,19 +2337,21 @@ vector3 normal_to_prism(prism *prsm, vector3 xc) vector3 axis = {0,0,0}; axis.z=height; vector3 retval; - double min_distance; + double min_distance=HUGE_VAL; // side walls - int nv; - for(nv=0; nv0.0) + { int nv; + for(nv=0; nvvertices.items; + int num_vertices = prsm->vertices.num_items; + double height = prsm->height; + + // choose a face + int num_faces = num_vertices + 2; + int which_face = rand() % num_faces; + if ( which_face < num_vertices ) // side face + { vector3 min_corner = vertices[which_face]; + vector3 max_corner = vertices[ (which_face+1)%num_vertices ]; + max_corner.z = height; + return random_point_in_box( prism_coordinate_p2c(prsm, min_corner), + prism_coordinate_p2c(prsm, max_corner) ); + } + else // floor or ceiling + { + vector3 p = random_point_in_polygon(vertices, num_vertices); + if (which_face==num_faces-1) p.z=height; + return prism_coordinate_p2c(prsm, p); + } +} + +/************************************************************************/ +/* random unit vector with direction uniformly distributed over unit sphere*/ /************************************************************************/ -vector3 random_unit_vector3(void) +vector3 random_unit_vector3() { - double z = urand(-1.0,1.0); - double rho = sqrt(1 - z*z); - double phi = urand(0.0, 2.0*K_PI); - return make_vector3( rho*cos(phi), rho*sin(phi), z ); + double cos_theta=urand(0.0,1.0), sin_theta=sqrt(1.0-cos_theta*cos_theta); + double phi=urand(0.0,2.0*K_PI); + return make_vector3(sin_theta*cos(phi), sin_theta*sin(phi), cos_theta); } /***************************************************************/ @@ -169,7 +209,7 @@ int test_point_inclusion(geometric_object the_block, geometric_object the_prism, int n; for(n=0; n