#!/usr/bin/env python3

class Triangle():
	#given segment
	def __init__(self,_a,_b,_c):
		self.a=_a
		self.b=_b
		self.c=_c
        
	def __repr__(self):
		return "Triangle:("+str(self.a)+","+str(self.b)+","+str(self.c)+")"
        # Center of gravity centered on #a
        # @return u how much to b
        # @return v how much in the c direction
    
	def barycentric(self,p):
		#How to use barycentric coordinates
		#http://www.blackpawn.com/texts/pointinpoly/default.html
		ca = self.c-self.a
		ba = self.b-self.a
		pa = p-self.a

		#Calculate dot product
		dotca = ca.dot(ca)
		dotcba = ca.dot(ba)
		dotcpa = ca.dot(pa)
		dotba = ba.dot(ba)
		dotbpa = ba.dot(pa)

		#Calculation of barycentric coordinates
		invDenom = 1 / (dotca * dotba - dotcba * dotcba);

		u = (dotba * dotcpa-dotcba*dotbpa)*invDenom
		v = (dotca * dotbpa - dotcba * dotcpa) * invDenom
		return u,v
        
	# Whether there is a point inside the triangle
	def isContain(self,p):
		u,v=self.barycentric(p)
		inkex.errormsg("\n u="+str(u)+" v="+str(v))
		If #u=v=0, the same point as the triangle point
		#Check if there is a point in the triangle
		return (u > 0) and (v > 0) and (u + v < 1)
        
	def toSVG(self):
		return str(self.a.x)+","+str(self.a.y)+","+str(self.b.x)+","+str(self.b.y)+","+str(self.c.x)+","+str(self.c.y)
	# Is the arrangement of vertices a, b, c clockwise?
    
	def isClockWise(self):
		circle=self.circumcircle()
		center=circle.center
		aTob=self.b-self.a
		aToc=self.c-self.a
		#Let's find the cross product
		cross=aTob.cross(aToc)

		inkex.errormsg(" cross"+str(cross))
		if(cross>0):
			return True
		return False#Counterclockwise
        
	def circumcircle(self):
		#Find the length of each side
		ab=(self.a-self.b).length()
		bc=(self.b-self.c).length()
		ca=(self.c-self.a).length()
		s=(ab+bc+ca)/2.0;
		area=math.sqrt(s*(s-ab)*(s-bc)*(s-ca));
		maxlength=0
		if(maxlength<ab):
			maxlength=ab;longestEdge=2
		if(maxlength<bc):
			maxlength=bc;longestEdge=0;
		if(maxlength<ca):
			maxlength=ca;longestEdge=1

		if longestEdge==0:
				ha=2*area/bc;
				angleB=math.asin(ha/ab);
				angleC=math.asin(ha/ca);
				angleA=math.pi-angleB-angleC;
		if longestEdge== 1:
				hb=2*area/ca;
				angleA=math.asin(hb/ab);
				angleC=math.asin(hb/bc);
				angleB=math.pi-angleC-angleA;
		if longestEdge== 2:
				hc=2*area/ab;
				angleB=math.asin(hc/bc);
				angleA=math.asin(hc/ca);
				angleC=math.pi-angleA-angleB;

		A = math.sin(2.0*angleA);
		B = math.sin(2.0*angleB);
		C = math.sin(2.0*angleC);
		center=Vertex((self.a.x * A + self.b.x * B + self.c.x * C) / (A+B+C),
			(self.a.y * A + self.b.y * B + self.c.y * C) / (A+B+C));
		rad=bc / math.sin(angleA) / 2.0
		return Circle(center,rad);