/*
	2D系の計算

	author:nakagawa[]ville.jp
	license:NYSL
*/
var Math2D = {
	//	2点間の距離の二乗
	d2 : function(p, q){
		return Math.pow((p.x - q.x), 2) + Math.pow((p.y - q.y), 2);
	},
	// 2点の座標からベクトルに
	pointsToVector : function(p, q){
		return {
			x : q.x - p.x,
			y : q.y - p.y
		};
	},
	// 三角形の重心
	getCenterOfGravity : function(triangle){
		// 任意の2つのベクトルの和の1/3が重心になる
		var p = this.pointsToVector(triangle[0], triangle[1]);
		var q = this.pointsToVector(triangle[0], triangle[2]);
		
		return {
			x : (p.x + q.x)/3 + triangle[0].x,
			y : (p.y + q.y)/3 + triangle[0].y
		}
	},
	/*
		三角形の外接円
		return {
			o : 中心の座標
			r2: 半径の二乗
		}
	*/
	getCircumscribedCircle : function(triangle){
		var px,py,qx,qy,rx,ry;
		var ax,ay,bx,by;
		var d,a,b,pl2,ql2,rl2,o,r2;
	
		px = triangle[0].x;
		py = triangle[0].y;
		qx = triangle[1].x;
		qy = triangle[1].y;
		rx = triangle[2].x;
		ry = triangle[2].y;
		
		ax = px - rx;
		ay = py - ry;
		bx = qx - rx;
		by = qy - ry;
		d = ax * by - ay * bx;
		if(d==0) return null;
	
		pl2 = px * px + py * py;
		ql2 = qx * qx + qy * qy;
		rl2 = rx * rx + ry * ry;
		a = pl2 - rl2;
		b = ql2 - rl2;
	
		o = {
			x : ( by * a - ay * b)/d/2,
			y : (-bx * a + ax * b)/d/2
		};
		r2 = this.d2(o, triangle[2]);
	
		return {
			o  : o,
			r2 : r2
		};
	}
};
