Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Raytracer

By: a guest on Sep 22nd, 2013  |  syntax: C  |  size: 1.65 KB  |  views: 786  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }