// ************************************************************************************************************************************

// 判断两条线是否相交
this.IsIntersect  = function IsIntersect(x1,y1,x2,y2,x3,y3,x4,y4)
{ // ----------------------------------------------------------------------------------------------------
// 优先考虑最大外截矩形是否相交
if(x3>Math.max(x1,x2) && x3<Math.min(x1,x2)&&x4>Math.max(x1,x2) && x4<Math.min(x1,x2)&&y3>Math.max(y1,y2) && y3<Math.min(y1,y2)&&y4>Math.max(y1,y2) && x4<Math.min(y1,y2))
{
return false;
}


// ----------------------------------------------------------------------------------------------------
// 是否平行y轴
if(x1 == x2 && x3 != x4)
{
var k2 = (y3-y4)/(x3-x4);
var c  = y3 - k2 * x3;
var y  = k2*x1 + c;
if(y>Math.min(y1,y2) && y<Math.max(y1,y2) && y>Math.min(y3,y4) && y<Math.max(y3,y4) )
{
return true;
}
else
{
return false;
}
}
if(x1 != x2 && x3 == x4)
{
var k1 = (y1-y2)/(x1-x2);
var b  = y1 - k1 * x1;
var y  = k1*x3 + b;
if(y>Math.min(y1,y2) && y<Math.max(y1,y2) && y>Math.min(y3,y4) && y<Math.max(y3,y4) )
{
return true;
}
else
{
return false;
}
}
if(x1 == x2 && x3 == x4)
{
return false;
}


// ----------------------------------------------------------------------------------------------------
// 两条线是否平行
var k1 = (y1-y2)/(x1-x2);
var k2 = (y3-y4)/(x3-x4);
if(k1==k2) return false;

// ----------------------------------------------------------------------------------------------------
// 普通线段
var b = y1 - k1 * x1;
var c = y3 - k2 * x3;
var y = ((k2*b)-(k1*c))/(k2-k1);
if(y>Math.min(y1,y2) && y<Math.max(y1,y2) && y>Math.min(y3,y4) && y<Math.max(y3,y4) )
{
return true; // 交点在两条线上
}

// ----------------------------------------------------------------------------------------------------
return false;

}


// ************************************************************************************************************************************
// ************************************************************************************************************************************

// -------------------------------------------------------------------------------------------------------
// 判断一个点(x,y)是否在一个不规则的多面内部
this.IsContainPolygon = function IsContainPolygon(arrLine,x,y)
{
var intTotalCount = 0;
for(var i=1;i<arrLine.length-1;i++)
{
var bContain = oParent.IsContainPoint(arrLine[i][0],arrLine[i][1],arrLine[i][2],arrLine[i][3],arrLine[0][0],arrLine[0][1],x,y);
if(bContain) intTotalCount++;
}
if(intTotalCount%2 == 1) return true;
return false;
}


// ************************************************************************************************************************************
// ************************************************************************************************************************************

// -------------------------------------------------------------------------------------------------------
// 判断一个点(x,y)是否在三角形的内部
this.IsContainPoint = function IsContainPoint(x1,y1,x2,y2,x3,y3,x,y)
{
// -------------------------------------------------------
// 重新对三角形的三个定点进行排序 便于建立临时坐标系
if(y1>y2)
{
var TmpX = x1;
var TmpY = y1;
x1=x2;
y1=y2;
x2=TmpX;
y2=TmpY;
}
if(y1==y2)
{
if(x1<x2)
{
var TmpX = x1;
var TmpY = y1;
x1=x2;
y1=y2;
x2=TmpX;
y2=TmpY;
}
}
if(y1>y3)
{
var TmpX = x1;
var TmpY = y1;
x1=x3;
y1=y3;
x3=TmpX;
y3=TmpY;
}
if(y1==y3)
{
if(x1<x3)
{
var TmpX = x1;
var TmpY = y1;
x1=x3;
y1=y3;
x3=TmpX;
y3=TmpY;
}
}
// -------------------------------------------------------

var m1,n1,m2,n2,m3,n3,m,n,Rad1,Rad2,Rad3;

// -------------------------------------------------------
// 以X1,Y1为坐标原点建立临时坐标系
m1=0;
n1=0;
m2=x2-x1;
n2=y2-y1;
m3=x3-x1;
n3=y3-y1;
m=x-x1
n=y-y1;

Rad1=Math.atan2(n2,m2);
Rad2=Math.atan2(n3,m3);
Rad3=Math.atan2(n,m);

// 不在第一个射线区域内,即不在三角形的内部
if(!(Rad3>=Math.min(Rad1,Rad2)&&Rad3<=Math.max(Rad1,Rad2))) return false;
// -------------------------------------------------------
// 以X3,Y3为坐标原点建立临时坐标系
m1=x1-x3;
n1=y1-y3;
m2=x2-x3;
n2=y2-y3;
m3=0;
n3=0;
m=x-x3;
n=y-y3;

Rad1=Math.atan2(n1,m1);
Rad2=Math.atan2(n2,m2);
Rad3=Math.atan2(n,m);

// 不在第二个射线区域内,即不在三角形的内部
if(!(Rad3>=Math.min(Rad1,Rad2)&&Rad3<=Math.max(Rad1,Rad2))) return false;

// -------------------------------------------------------
return true;
// -------------------------------------------------------

}