判断线段相交及求交
public TNode TCrossNode(TNode P1, TNode P2, TNode Q1, TNode Q2)
{
if (! TSegmentCrossed(P1, P2, Q1, Q2))
return null;
TNode cross = new TNode();
if (Math.Abs(P1.Sx - P2.Sx) < ERR)
{
if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
return null;
else
{
cross.Sx = P1.Sx;
cross.Sy = (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * P1.Sx + Q1.Sy - (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * Q1.Sx;
return cross;
}
}
else if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
{
cross.Sx = Q1.Sx;
cross.Sy = (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx) * Q1.Sx + P1.Sy - (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx) * P1.Sx;
return cross;
}
else if (Math.Abs(P1.Sy - P2.Sy) < ERR)
{
if (Math.Abs(Q1.Sy - Q2.Sy) < ERR)
return null;
else
{
cross.Sy = P1.Sy;
cross.Sx = (Q1.Sx - Q2.Sx) / (Q1.Sy - Q2.Sy) * P1.Sy + Q1.Sx - (Q1.Sx - Q2.Sx) / (Q1.Sy - Q2.Sy) * Q1.Sy;
return cross;
}
}
else if (Math.Abs(Q1.Sy - Q2.Sy) < ERR)
{
cross.Sy = Q1.Sy;
cross.Sx = (P1.Sx - P2.Sx) / (P1.Sy - P2.Sy) * Q1.Sy + P1.Sx - (P1.Sx - P2.Sx) / (P1.Sy - P2.Sy) * P1.Sy;
return cross;
}
else
{
double k1=0, k2=0;//斜率
double a1=0, a2=0;//截距
k1 = (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx);
k2 = (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx);
a1 = P1.Sy - k1 * P1.Sx;
a2 = Q1.Sy - k2 * Q1.Sx;
if (Math.Abs(k1 - k2) < ERR)
return null;
cross.Sx = (a2 - a1) / (k1 - k2);
cross.Sy = (a2 - a1) / (k1 - k2) * k1 + a1;//点斜式
return cross;
}
}
{
if (! TSegmentCrossed(P1, P2, Q1, Q2))
return null;
TNode cross = new TNode();
if (Math.Abs(P1.Sx - P2.Sx) < ERR)
{
if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
return null;
else
{
cross.Sx = P1.Sx;
cross.Sy = (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * P1.Sx + Q1.Sy - (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * Q1.Sx;
return cross;
}
}
else if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
{
cross.Sx = Q1.Sx;
cross.Sy = (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx) * Q1.Sx + P1.Sy - (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx) * P1.Sx;
return cross;
}
else if (Math.Abs(P1.Sy - P2.Sy) < ERR)
{
if (Math.Abs(Q1.Sy - Q2.Sy) < ERR)
return null;
else
{
cross.Sy = P1.Sy;
cross.Sx = (Q1.Sx - Q2.Sx) / (Q1.Sy - Q2.Sy) * P1.Sy + Q1.Sx - (Q1.Sx - Q2.Sx) / (Q1.Sy - Q2.Sy) * Q1.Sy;
return cross;
}
}
else if (Math.Abs(Q1.Sy - Q2.Sy) < ERR)
{
cross.Sy = Q1.Sy;
cross.Sx = (P1.Sx - P2.Sx) / (P1.Sy - P2.Sy) * Q1.Sy + P1.Sx - (P1.Sx - P2.Sx) / (P1.Sy - P2.Sy) * P1.Sy;
return cross;
}
else
{
double k1=0, k2=0;//斜率
double a1=0, a2=0;//截距
k1 = (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx);
k2 = (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx);
a1 = P1.Sy - k1 * P1.Sx;
a2 = Q1.Sy - k2 * Q1.Sx;
if (Math.Abs(k1 - k2) < ERR)
return null;
cross.Sx = (a2 - a1) / (k1 - k2);
cross.Sy = (a2 - a1) / (k1 - k2) * k1 + a1;//点斜式
return cross;
}
}