ブレゼンハム線分アルゴリズム
前回、ブレゼンハム線分アルゴリズムについて、
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; } } } } } }