三角形の中にあるドットを調べる
三角形の中にある整数の座標を調べるメソッドを作りました。
ソースはこんな感じです。上と真ん中と下の点を探して上から順に走査してます。
public function check(point1:Point, point2:Point, point3:Point):Vector.<Point> { //Pointを上中下に振り分ける var topPoint:Point = (point1.y < point2.y)?point1:point2; topPoint = (point3.y < topPoint.y)?point3:topPoint; var bottomPoint:Point = (point1.y > point2.y)?point1:point2; bottomPoint = (point3.y > bottomPoint.y)?point3:bottomPoint; var middlePoint:Point; if (point1 != topPoint && point1 != bottomPoint) middlePoint = point1 else if (point2 != topPoint && point2 != bottomPoint) middlePoint = point2 else middlePoint = point3; //右と左の範囲の座標を調べる var left:Number = (point1.x < point2.x)?point1.x:point2.x; left = (point3.x < left)?point3.x:left; var right:Number = (point1.x > point2.x)?point1.x:point2.x; right = (point3.x > right)?point3.x:right; //上と下の範囲の座標を調べる var top:Number = topPoint.y; var bottom:Number = bottomPoint.y; var middle:Number = middlePoint.y; //整数にする left = int(left); right = int(right); top = int(top); bottom = int(bottom); middle = int(middle); //角度 var angleTop2Bottom:Number = Math.PI/2 - Math.atan2(int(bottomPoint.y)-int(topPoint.y),int(bottomPoint.x)-int(topPoint.x)); var angleTop2Middle:Number = Math.PI/2 - Math.atan2(int(topPoint.y)-int(middlePoint.y),int(topPoint.x)-int(middlePoint.x)); var angleMiddle2Bottom:Number = Math.PI/2 - Math.atan2(int(bottomPoint.y)-int(middlePoint.y),int(bottomPoint.x)-int(middlePoint.x)); //return用 var vec:Vector.<Point> = new Vector.<Point>(); var y:int; var x:int; var l:Number; var r:Number; //上から下へループ for (y = top; y < bottom; y++) { //TOPからMIDDLEまでの区間 if (y < int(middlePoint.y)) { //middleが左にあった場合 if (middlePoint.x < bottomPoint.x) { l = Math.tan(angleTop2Middle)*(y-top)+int(topPoint.x); r = Math.tan(angleTop2Bottom)*(y-top)+int(topPoint.x); } //bottomが左にあった場合 else { l = Math.tan(angleTop2Bottom)*(y-top)+int(topPoint.x); r = Math.tan(angleTop2Middle)*(y-top)+int(topPoint.x); } this.graphics.lineStyle(1, 0x0000FF); } //MIDDLEからBOTTOMまでの区間 else { //middleが左にあった場合 又は bottomが左にあった場合 l = Math.tan(angleMiddle2Bottom)*(y-middle)+int(middlePoint.x); r = Math.tan(angleTop2Bottom)*(y-top)+int(topPoint.x); this.graphics.lineStyle(1, 0xFF00FF); } //左右入れ替わっている可能性があるので入れ替える var tmpL:int = (l < r)?l:r; var tmpR:int = (l < r)?r:l; l = int(tmpL); r = int(tmpR); //配列につっこむ for (x = l; x < r; x++) vec.push(new Point(x, y)); } return vec; }
こちらを参考にさせて頂きつつ、このメソッドを使ってこんなのを作ってみました。
http://aquioux.blog48.fc2.com/blog-entry-625.html