A method for avoiding collisions with walls without needing to reverse direction. In other words, instead of reversing direction every time your bot would hit the wall (which can be very predictable), your bot will instead turn as it approaches the wall, then move right along the wall.
How it works
Generally, Wall Smoothing is accomplished by extending an imaginary stick (sometimes called a "blind man's stick") from the front and back of the bot and testing if that stick would touch the wall. If it would, then you adjust the bot's new heading until the stick would not touch the wall. A stick length of about 120 to 150 works well for most bots.
In the image above, our robot (the small blue circle) is driving in a circle around an enemy (the red circle). The enemy is 250 units away. Our Wall Smoothing algorithm is currently using a 150 unit distance, so we're going to pick destinations that lie somewhere on the outer dark blue circle. The bright green circle is our destination if we drive clockwise around our enemy, the darker green circle is our destination if we drive counter-clockwise around our enemy. Since we're not yet near a wall, no smoothing is needed.
Now we've been driving around our enemy clockwise for a bit more time, and we're starting to approach a wall. The end of the black field is the side of the battlefield. The gray line represents the closest we can get to that wall, which is 18 units. Since we can't drive directly perpendicular to our opponent for 150 units any more, we choose a "smoothed" point which is closer to the enemy. In other words, we choose the intersection of the gray line and our 150 unit dark blue circle. The advantages of doing this are
- We don't hit any walls.
- We can still drive clockwise or counter-clockwise, so we're less predictable (and therefore harder to shoot) than if we always just reversed direction when we came near a wall.
If we keep driving clockwise, the "smoothing angle" will get steeper and steeper, meaning that we are driving more towards our enemy instead of perpendicular.
There are several implementations of Wall Smoothing available on the /Code sub-page.