ブレゼンハム線分アルゴリズム

前回、ブレゼンハム線分アルゴリズムについて、
Eの変数の使用について分からないと書きましたが、
やっと理解できたので、メモっておきます。


参考にしたサイトは、
伝説のお茶の間というサイトです。
とてもわかりやすく書かれてあって、よかったです。


前回、理解できていなかったEの変数は、
xが1増えたときにyはどのくらい増やすのか?という部分でした。
Eは、yの増加したときの小数部分らしいです。

ブレゼンハム線分アルゴリズムの実装例

一応、AS3での実装例を載せておきます。
これは、Playerを追いかけるEnemyクラスです。

package enemies {
	import flash.display.Sprite;
	import flash.geom.Point;
	
	import players.Player01;

	/**
	 * ブレゼンハム線分アルゴリズムで追跡する敵。
	 */
	public class Enemy02 extends Sprite {
		
		// +++++++++++++++++++++++++++++++++++++++++++++++
		// 初期化
		// +++++++++++++++++++++++++++++++++++++++++++++++
		public function Enemy02() {
			var image:EnemyDesign = new EnemyDesign();
			image.x = -image.width/2;
			image.y = -image.height/2;
			addChild(image);
		}
		
		
		// +++++++++++++++++++++++++++++++++++++++++++++++
		// パブリックメソッド
		// +++++++++++++++++++++++++++++++++++++++++++++++
		private var _moveCount:int = 0;
		private var _maxMoveCount:int = 0;
		
		public function move():void {
			if (!(Player01.getInstance().x == _playerX && Player01.getInstance().y == _playerY)) {
				setPoints();
				_moveCount = 0;
				_maxMoveCount = _points.length;
			}
			
			if (_moveCount < _maxMoveCount) {
				_moveCount++;
				var p:Point = _points[_moveCount] as Point;
				x = p.x;
				y = p.y;
			}
		}
		
		
		// +++++++++++++++++++++++++++++++++++++++++++++++++++++
		// プライベートメソッド
		// +++++++++++++++++++++++++++++++++++++++++++++++++++++
		private var _points:Array = new Array();
		private var _playerX:Number = 0;
		private var _playerY:Number = 0;
		
		private function setPoints():void {
			_points = new Array();
			
			_playerX = Player01.getInstance().x;
			_playerY = Player01.getInstance().y;
			var dx:int = Math.abs(_playerX - x);
			var dy:int = Math.abs(_playerY - y);
			var sx:int = (_playerX > x)? 1 : -1;
			var sy:int = (_playerY > y)? 1 : -1;
			var x0:int = x;
			var y0:int = y;
			var e:int = 0;
			
			// 傾きが1以下の場合
			if (dx >= dy) {
				e = -dx;
				for (var xx:int=0; xx<=dx; xx++) {
					_points.push(new Point(x0, y0));
					
					x0 += sx;
					
					e += 2*dy;
					if (e >= 0) {
						y0 += sy;
						e -= 2*dx;
					}
				}
			}
			// 傾きが1より大きい場合
			else {
				e = -dy;
				for (var yy:int=0; yy<=dy; yy++) {
					_points.push(new Point(x0, y0));
					
					y0 += sy;
					
					e += 2*dx;
					if (e >= 0) {
						x0 += sx;
						e -= 2*dy;
					}
				}
			}
		}
		
	}
}