home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / spam / ray.c < prev    next >
C/C++ Source or Header  |  1994-11-26  |  3KB  |  136 lines

  1. #include <dos.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4.  
  5. typedef unsigned char BYTE;
  6. typedef signed short WORD;
  7. typedef signed long DWORD;
  8.  
  9. #define GLASS_DENSITY 1.6
  10. #define MAXANGLE M_PI/3.5
  11. #define DISTANCE 2
  12. #define WIDTH 160
  13. #define HEIGHT 120
  14. #define RANGE 101
  15. #define RAD2DEG(x) ((x)*180/M_PI)
  16. #define Check(x) /* printf("%11.7f " #x "\n", x) */
  17. #define NewLine /* putchar ('\n') */
  18.  
  19. double AngleBetween (double, double, double, double);
  20. void   Init();
  21. double Intersection (double, double, double, double, int);
  22. double Length (double, double);
  23. double Sqr (double);
  24.  
  25. WORD aZ[RANGE],
  26.      aDr[RANGE];
  27.  
  28. int main ()
  29.   {
  30.   Init();
  31.   return 0;
  32.   }
  33.  
  34. double AngleBetween (double dx1, double dy1, double dx2, double dy2)
  35.   {
  36.   return acos((dx1*dx2+dy1*dy2)/Length(dx1,dy1)/Length(dx2,dy2));
  37.   }
  38.  
  39. void Init ()
  40.   {
  41.   double Alpha,
  42.          Beta,
  43.          Gamma,
  44.          Delta,
  45.          Eta,
  46.          Lambda,
  47.          dr,
  48.      temp,
  49.          x1, z1,
  50.          x2, z2,
  51.          z;
  52.   int    x;
  53.  
  54.   for (x=0, Alpha=0; x<RANGE; x++, Alpha+=MAXANGLE/RANGE)
  55.     {
  56.     if (Alpha < atan(1.0/DISTANCE))
  57.       {
  58.       NewLine;
  59.       /* calculate 1st intersection */
  60.       Lambda=Intersection (0,sin(Alpha), -DISTANCE,cos(Alpha), 0);
  61.       x1=Lambda*sin(Alpha);
  62.       z1=-DISTANCE+Lambda*cos(Alpha);
  63.       Check (RAD2DEG(Alpha));
  64.       Check (Lambda);
  65.       Check (x1);
  66.       Check (z1);
  67.       Check (Sqr(x1)+Sqr(z1)); 
  68.  
  69.       /* calculate 2nd intersection */
  70.       Beta=AngleBetween (0-x1,-2-z1, x1, z1);
  71.       Delta=asin(sin(Beta)/GLASS_DENSITY);
  72.       Gamma=atan(x1/z1)+Delta;
  73.       Lambda=Intersection (x1,sin(Gamma), z1,cos(Gamma), 1);
  74.       x2=x1+Lambda*sin(Gamma);
  75.       z2=z1+Lambda*cos(Gamma);
  76.       Check (RAD2DEG(Beta));
  77.       Check (RAD2DEG(Gamma));
  78.       Check (Lambda);
  79.       Check (x2);
  80.       Check (z2);
  81.       Check (Sqr(x2)+Sqr(z2));
  82.       Check (RAD2DEG(Delta));
  83.  
  84.       /* calculate the rest */
  85.       Eta=atan(x2/z2)-Beta;
  86.       Check(RAD2DEG(Eta));
  87.       if (Eta==0)
  88.         {
  89.         dr=0;
  90.         z=4;
  91.         }
  92.       else
  93.         {
  94.         dr=-tan(Eta);
  95.         z=z2+x2/dr;
  96.         }
  97.       }
  98.     else
  99.       {
  100.       z=-DISTANCE;
  101.       dr=-tan(Alpha);
  102.       }
  103.     aZ[x]=z*256;
  104.     aDr[x]=dr*256;
  105.     }
  106.   printf ("AZ");
  107.   for (x=0; x<RANGE; x++)
  108.     printf ("\t\tDW\t%d\n", aZ[x]);
  109.   printf ("\nADR");
  110.   for (x=0; x<RANGE; x++)
  111.     printf ("\t\tDW\t%d\n", aDr[x]);
  112.   }
  113.  
  114. double Length (double x, double y)
  115.   {
  116.   return sqrt(Sqr(x)+Sqr(y));
  117.   }
  118.  
  119. double Sqr (double x)
  120.   {
  121.   return x*x;
  122.   }
  123.  
  124. double Intersection (double a, double b, double c, double d, int i)
  125.   {
  126.   double x, y, z, t;
  127.  
  128.   x=Sqr(b)+Sqr(d);
  129.   y=a*b+c*d;
  130.   z=1-Sqr(a)-Sqr(c);
  131.   t=sqrt(z/x+Sqr(y/x));
  132.   if (i==1)
  133.     return t-y/x;
  134.   return -t-y/x;
  135.   }
  136.