読者です 読者をやめる 読者になる 読者になる

三角形の中にあるドットを調べる

三角形の中にある整数の座標を調べるメソッドを作りました。

ソースはこんな感じです。上と真ん中と下の点を探して上から順に走査してます。

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

ソースはこちらからダウンロードできます。