Advertisement
Guest User

Raytracer

a guest
Sep 22nd, 2013
895
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.65 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. FILE * m;
  6.  
  7. typedef int i;
  8. typedef float f;
  9.  
  10. struct v{
  11.     f x,y,z;
  12.  
  13.     v operator+(v r){
  14.         return v(x+r.x,y+r.y,z+r.z);
  15.     }
  16.    
  17.     v operator*(f r){
  18.         return v(x*r,y*r,z*r);
  19.     }
  20.    
  21.     f operator%(v r){
  22.         return x*r.x+y*r.y+z*r.z;
  23.     }
  24.  
  25.     v(){}
  26.    
  27.     v operator^(v r){
  28.         return v(y*r.z-z*r.y,z*r.x-x*r.z,x*r.y-y*r.x);
  29.     }
  30.    
  31.     v(f a,f b,f c){
  32.         x=a;y=b;z=c;
  33.     }
  34.  
  35.     v operator!(){
  36.         return *this*(1/sqrt(*this%*this));
  37.     }
  38. };
  39.  
  40. i G[]={247570,280596,280600,249748,18578,18577,231184,16,16};
  41.  
  42. f R(){
  43.     return(f)rand()/RAND_MAX;
  44. }
  45.  
  46.  
  47. i T(v o,v d,f&t,v&n){
  48.     t=1e9;
  49.     i m=0;
  50.     f p=-o.z/d.z;
  51.     if(.01<p)t=p,n=v(0,0,1),m=1;
  52.    
  53.     for(i k=19;k--;)       
  54.         for(i j=9;j--;)
  55.             if(G[j]&1<<k){
  56.                 v p=o+v(-k,0,-j-4);
  57.                 f b=p%d,c=p%p-1,q=b*b-c;
  58.                 if(q>0){
  59.                     f s=-b-sqrt(q);
  60.                    
  61.                     if(s<t&&s>.01)
  62.                         t=s,n=!(p+d*t),m=2;
  63.                 }
  64.             }
  65.             return m;
  66. }
  67.  
  68. v S(v o,v d){
  69.     f t;
  70.     v n;
  71.     i m=T(o,d,t,n);
  72.    
  73.     if(!m)return v(.7,.6,1)*pow(1-d.z,4);
  74.  
  75.     v h=o+d*t,l=!(v(9+R(),9+R(),16)+h*-1),r=d+n*(n%d*-2);
  76.  
  77.     f b=l%n;
  78.    
  79.     if(b<0||T(h,l,t,n))
  80.         b=0;
  81.  
  82.     f p=pow(l%r*(b>0),99);
  83.    
  84.     if(m&1){
  85.         h=h*.2;
  86.         return((i)(ceil(h.x)+ceil(h.y))&1?v(3,1,1):v(3,3,3))*(b*.2+.1);
  87.     }
  88.  
  89.     return v(p,p,p)+S(h,r)*.5;
  90. }
  91.                
  92. i main()
  93. {
  94.     m=fopen("f.ppm","w");
  95.     fprintf(m,"P6 512 512 255 ");
  96.  
  97.     v g=!v(-6,-16,0),a=!(v(0,0,1)^g)*.002,b=!(g^a)*.002,c=(a+b)*-256+g;
  98.  
  99.     for(i y=512;y--;)
  100.         for(i x=512;x--;)
  101.         {
  102.             v p(13,13,13);
  103.             for(i r=64;r--;)
  104.             {
  105.                 v t=a*(R()-.5)*99+b*(R()-.5)*99;
  106.                 p=S(v(17,16,8)+t,!(t*-1+(a*(R()+x)+b*(y+R())+c)*16))*3.5+p;
  107.             }
  108.             fprintf(m,"%c%c%c",(i)p.x,(i)p.y,(i)p.z);
  109.         }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement