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
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