[Prev] [Home] [Next]

To do this, we need to check any grid intersection points that are encountered by the ray; and see if there is a wall on the grid or not. The best way is to check for horizontal and vertical intersections separately. When there is a wall on either a vertical or a horizontal intersection, the checking stops. The distance to both intersection points is then compared, and the closer distance is chosen. This process is illustrated in the following two figures.

Figure 15  

Steps of finding intersections with horizontal grid lines:

    1. Find coordinate of the first intersection (point A in this example).
    2. Find Ya. (Note: Ya is just the height of the grid; however, if the ray is facing up, Ya will be negative, if the ray is facing down, Ya will be positive.)
    3. Find Xa using the equation given above.
    4. Check the grid at the intersection point. If there is a wall on the grid, stop and calculate te distance.
    5. If there is no wall, extend the to the next intersection point. Notice that the coordinate of the next intersection point -call it (Xnew,Ynew) is Xnew=Xold+Xa, and Ynew=YOld+Ya.

    As an example the following is how you can get the point A:

      Note: remember the Cartesian coordinate is 
      increasing downward (as in page 3), and
      any fractional values will be rounded down.
      
      ======Finding horizontal intersection ======
      1. Finding the coordinate of A.  
         If the ray is facing up      
           A.y = rounded_down(Py/64) * (64) - 1;
         If the ray is facing down
           A.y = rounded_down(Py/64) * (64) + 64;
      
         (In the picture, the ray is facing up, so we use
         the first formula.  
         A.y=rounded_down(224/64) * (64) - 1 = 191;
         Now at this point, we can find out the grid 
         coordinate of y.
         However, we must decide whether A is part of 
         the block above the line,
         or the block below the line.  
         Here, we chose to make A part of the block
         above the line, that is why we subtract 1 from A.y.
         So the grid coordinate of A.y is 191/64 = 2;
      
         A.x = Px + (Py-A.y)/tan(ALPHA);
         In the picture, (assume ALPHA is 60 degrees), 
         A.x=96 + (224-191)/tan(60) = about 115;
         The grid coordinate of A.x is 115/64 = 1;
      
         So A is at grid (1,2) and we can check 
         whether there is a wall on that grid.
         There is no wall on (1,2) so the ray will be 
         extended to C.
      
      2. Finding Ya
         If the ray is facing up      
           Ya=-64;
         If the ray is facing down
           Ya=64;
      
      3. Finding Xa
         Xa = 64/tan(60) = 36;
      
      4. We can get the coordinate of C as follows:
         C.x=A.x+Xa = 115+36 = 151;
         C.y=A.y+Ya = 191-64 = 127;
         Convert this into grid coordinate by 
         dividing each component with 64.  
         The result is 
         C.x = 151/64 = 2 (grid coordinate), 
         C.y = 127/64 = 1 (grid coordinate) 
         So the grid coordinate of C is (2, 1).  
         (C programmer's note: Remember we always round down, 
         this is especially true since
         you can use right shift by 8 to divide by 64).
      
      5. Grid (2,1) is checked.  
         Again, there is no wall, so the ray is extended 
         to D.  
         
      6. We can get the coordinate of D as follows:
         D.x=C.x+Xa = 151+36 = 187;
         D.y=C.y+Ya = 127-64 = 63;
         Convert this into grid coordinate by 
         dividing each component with 64.  
         The result is 
         D.x = 187/64 = 2 (grid coordinate), 
         D.y = 63/64 = 0 (grid coordinate) 
         So the grid coordinate of D is (2, 0).  
      
      6. Grid (2,0) is checked.  
         There is a wall there, so the process stop.

      (Programmer's note: You can see that once we have the value of Xa and Ya, the process is very simple. We just keep adding the old value with Xa and Ya, and perform shift operation, to find out the grid coordinate of the next point hit by the ray.)

     


    Steps of finding intersections with vertical grid lines:

      1. Find coordinate of the first intersection (point B in this example).
      The ray is facing right in the picture, so B.x = rounded_down(Px/64) * (64) + 64.
      If the ray had been facing left B.x = rounded_down(Px/64) * (64) - 1.
      A.y = Py + (Px-A.x)*tan(ALPHA);
      2. Find Xa. (Note: Xa is just the width of the grid; however, if the ray is facing right, Xa will be positive, if the ray is facing left, Ya will be negative.)
      3. Find Ya using the equation given above.
      4. Check the grid at the intersection point. If there is a wall on the grid, stop and calculate te distance.
      5. If there is no wall, extend the to the next intersection point. Notice that the coordinate of the next intersection point -call it (Xnew,Ynew) is just Xnew=Xold+Xa, and Ynew=YOld+Ya.

      In the picture, First, the ray hits point B. Grid (2,2) is checked. There no wall on (2,2) so the ray is extended to E. Grid (3,0) is checked. There is a wall there, so we stop and calculate the distance.

    In this example, point D is closer than E. So the wall slice at D (not E) will be drawn

Examples in Javascript (with source code)

Alt text

[Prev] [Home] [Next]

Advertisements