Advertisement
mrhumbility

Probability Sphere Origin in Tetrahedron

Nov 8th, 2018
735
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. //make outside sphere for vis
  2. float scale = ch('scale');
  3. int origpt = addpoint(0, 0);
  4. setpointattrib(0, "Alpha", origpt, 0.3);
  5. int sphere = addprim(0, "sphere", origpt);
  6. matrix scalem = maketransform(0, 0, {0,0,0}, {0,0,0}, scale, 0);
  7. setprimintrinsic(0, "transform", sphere, matrix3(scalem));
  8.  
  9. //make a little sphere at the origin
  10. int vispt = addpoint(0, 0);
  11. int vissphere = addprim(0, "sphere", vispt);
  12. matrix viss = maketransform(0, 0, {0,0,0}, {0,0,0}, scale * 0.02, 0);
  13. setprimintrinsic(0, "transform", vissphere, matrix3(viss));
  14.  
  15. //loop generate a tetrahedron and calc if origin is inside it
  16. int iter = chi('iterations');
  17. iter = 15000;
  18. int count = 0;
  19. int make_geo = chi('make_geo');
  20. int pt1, pt2, pt3, pt4;
  21. for(int i = 0; i < iter; i += 1){
  22.     float seed = ch('seed') + i;
  23.     seed = 0.283 + i;
  24.    
  25.    
  26.     vector pos1 = normalize(fit01(vector(rand(2.4 + seed)), -1, 1)) * scale;
  27.     vector pos2 = normalize(fit01(vector(rand(3.4 + seed)), -1, 1)) * scale;
  28.     vector pos3 = normalize(fit01(vector(rand(4.4 + seed)), -1, 1)) * scale;
  29.     vector pos4 = normalize(fit01(vector(rand(5.4 + seed)), -1, 1)) * scale;
  30.     if(make_geo == 1){
  31.         pt1 = addpoint(0, pos1);
  32.         pt2 = addpoint(0, pos2);
  33.         pt3 = addpoint(0, pos3);
  34.         pt4 = addpoint(0, pos4);
  35.        
  36.         int prim1 = addprim(0, "poly", pt1, pt2, pt3);
  37.         int prim2 = addprim(0, "poly", pt2, pt3, pt4);
  38.         int prim3 = addprim(0, "poly", pt3, pt4, pt1);
  39.         int prim4 = addprim(0, "poly", pt4, pt1, pt2);
  40.     }
  41.     int intersect3D_RayTriangle( vector R[]; vector T[]){
  42.         vector    u, v, n;              // triangle vectors
  43.         vector    dir, w0, w;           // ray vectors
  44.         float     r, a, b;              // params to calc ray-plane intersect
  45.    
  46.         // get triangle edge vectors and plane normal
  47.         u = T[1] - T[0];
  48.         v = T[2] - T[0];
  49.         n = cross(u, v);              // cross product
  50.         if (n == {0,0,0})             // triangle is degenerate
  51.             return -1;                  // do not deal with this case
  52.    
  53.         dir = R[1] - R[0];              // ray direction vector
  54.         w0 = R[0] - T[0];
  55.         a = -dot(n,w0);
  56.         b = dot(n,dir);
  57.         if (abs(b) < 0.000001) {     // ray is  parallel to triangle plane
  58.             if (a == 0)                 // ray lies in triangle plane
  59.                 return 2;
  60.             else return 0;              // ray disjoint from plane
  61.         }
  62.    
  63.         // get intersect point of ray with triangle plane
  64.         r = a / b;
  65.         if (r < 0.0)                    // ray goes away from triangle
  66.             return 0;                   // => no intersect
  67.         // for a segment, also test if (r > 1.0) => no intersect
  68.    
  69.         vector I = R[0] + r * dir;            // intersect point of ray and plane
  70.         //addpoint(0, I);
  71.    
  72.         // is I inside T?
  73.         float    uu, uv, vv, wu, wv, D;
  74.         uu = dot(u,u);
  75.         uv = dot(u,v);
  76.         vv = dot(v,v);
  77.         w = I - T[0];
  78.         wu = dot(w,u);
  79.         wv = dot(w,v);
  80.         D = uv * uv - uu * vv;
  81.    
  82.         // get and test parametric coords
  83.         float s, t;
  84.         s = (uv * wv - vv * wu) / D;
  85.         if (s < 0.0 || s > 1.0)         // I is outside T
  86.             return 0;
  87.         t = (uv * wu - uu * wv) / D;
  88.         if (t < 0.0 || (s + t) > 1.0)  // I is outside T
  89.             return 0;
  90.    
  91.         return 1;                       // I is in T
  92.     }
  93.    
  94.    
  95.     vector R[] = {{0,0,0}, {0,- 1,0}};
  96.     vector T[] = array(pos1, pos2, pos3);
  97.    
  98.     int hit = intersect3D_RayTriangle(R, T);
  99.    
  100.     T = array(pos2, pos3, pos4);
  101.     hit += intersect3D_RayTriangle(R, T);
  102.    
  103.     T = array(pos3, pos4, pos1);
  104.     hit += intersect3D_RayTriangle(R, T);
  105.    
  106.     T = array(pos4, pos1, pos2);
  107.     hit += intersect3D_RayTriangle(R, T);
  108.     if(hit % 2 != 0){
  109.         if(make_geo >0){
  110.             setpointattrib(0, "Cd", pt1, {1, 0, 0});
  111.             setpointattrib(0, "Cd", pt2, {1, 0, 0});
  112.             setpointattrib(0, "Cd", pt3, {1, 0, 0});
  113.             setpointattrib(0, "Cd", pt4, {1, 0, 0});
  114.         }
  115.         setpointattrib(0, "Cd", vispt, {1, 0, 0});
  116.         count += 1;
  117.     }
  118.  
  119. }
  120. @result = float(count) / float(iter);
  121. @ref = 1.0/8.0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement