Step 10 : Point View and Angles Tricks

Dealing with angles is not a piece of cake. In the last step, we have seen than angles are circular data so angles should be wrapped or corrected:
  • If an Angle gets bigger than 2*PI then Angle=Angle - 2*Math.PI;
  • If an Angle gets negative then Angle=Angle + 2*Math.PI;
  • This should be taken into account when computing the distances to the walls according to a given Point of View :
      The starting angle is : startangle=POVrad-this.HalfFOVrad;
      	
      				// wrap around if necessary
      				if (startangle < 0)
      				{
      					startangle=2*Math.PI + startangle;
      				}
      	
      The ending angle is : var endangle=POVrad+this.HalfFOVrad;
      	
      				// wrap around if necessary
      				if (endangle>=2*Math.PI){
      					endangle-=2*Math.PI;
      				}
      	
  • A ray should be cast for all angles between the start angle and then end angle
    1. 	
      				var rayangle=startangle;	
      				for (var i=0; i<this.nbangles; i++)
      				{	
      					var d=this.ComputeOneBestWallIntersection(xunitplayer,yunitplayer,rayangle,draw,0);
      					
      					this.distancesToWalls[i]=d;
      					rayangle=rayangle+this.AngleRadByColumn;
      					// wrap around if necessary	
      					if (rayangle>=2*Math.PI){
      						rayangle-=2*Math.PI;
      					}
      				}
      	
  • All Together
  • 
    			ComputeBestWallIntersections : function(xunitplayer,yunitplayer,POVrad,debug,draw)
    			{
    			
    				var startangle=POVrad-this.HalfFOVrad;
    				
    				// wrap around if necessary
    				if (startangle < 0)
    				{
    					startangle=2*Math.PI + startangle;
    				}
    				
    				
    				var endangle=POVrad+this.HalfFOVrad;
    				// wrap around if necessary
    				if (endangle>=2*Math.PI){
    					endangle-=2*Math.PI;
    				}
    				
    				var str="";
    				var rayangle=startangle;
    				
    				for (var i=0; i<this.nbangles; i++)
    				{	
    					var d=this.ComputeOneBestWallIntersection(xunitplayer,yunitplayer,rayangle,draw,0);
    					
    					this.distancesToWalls[i]=d;
    					rayangle=rayangle+this.AngleRadByColumn;
    					// wrap around if necessary	
    					if (rayangle>=2*Math.PI){
    						rayangle-=2*Math.PI;
    					}
    				}
    				
    				return 1;
    			},
    			
    			
    
    		
                
            
    

    Next: Step 11: Sky and Ground

  • step11.html

    Back: Step 8

  • step9.html