public static void Run_PolygonsIntersection()
{
int count = 0;
Ps1[0] = new Point(0, 0);
Ps1[1] = new Point(3, 0);
Ps1[2] = new Point(0, 3);
Ps1[3] = new Point(0, 0);
Ps2[0] = new Point(1, 1);;
Ps2[1] = new Point(4, 1);
Ps2[2] = new Point(4, 4);
Ps2[3] = new Point(1, 1);
var pointlist1 = new List<Point>(Ps1);
var pointlist2 = new List<Point>(Ps2);
for (var i = 0; i < M-1; i++)
{
for (var j = 0; j < N-1; j++)
{
if (SegmentIntersect(Ps1[i], Ps1[i + 1], Ps2[j], Ps2[j + 1]))
{
count++;
Console.WriteLine(LinesEquation(i,j));
}
}
}
if (count != 0)
{
Console.WriteLine();
Console.WriteLine("两多边形相交!");
}
else
{
Console.WriteLine("两多边形不相交!!!");
}
}
public static string LinesEquation(int s,int t)
{
var ret="相交直线至少有一条方程不存在";
if (Math.Abs((Ps1[s + 1].X - Ps1[s].X)) < 0.0000000000000000000000001 || Math.Abs((Ps2[t + 1].X - Ps2[t].X)) < 0.0000000000000000000000001)
{
return ret;
}
var k1 = ((Ps1[s + 1].Y - Ps1[s].Y) / (Ps1[s + 1].X - Ps1[s].X));
var c1 = Ps1[s + 1].Y - k1 * Ps1[s].X;
var k2 = ((Ps2[t + 1].Y - Ps2[t].Y) / (Ps2[t + 1].X - Ps2[t].X));
var c2 = Ps2[t + 1].Y - k2 * Ps2[t].X;
if (c1 < 0 && c2<0)
{
ret ="相交边的方程为:"+ k1 + "x-y" + c1 + "=0和"+k2 + "x-y" + c2 + "=0";
}
if (c1 < 0 && c2 >= 0)
{
ret = "相交边的方程为:" + k1 + "x-y" + c1 + "=0和" + k2 + "x-y" + "+" + c2 + "=0";
}
if (c1 >= 0 && c2 < 0)
{
ret = "相交边的方程为:" + k1 + "x-y" + "+" + c1 + "=0和" + k2 + "x-y" + c2 + "=0";
}
if (c1 >= 0 && c2 >=0)
{
ret = "相交边的方程为:" + k1 + "x-y" + "+" + c1 + "=0和" + k2 + "x-y" + "+" + c2 + "=0";
}
return ret;
}
public static double Direction(Point point1, Point point2, Point point3)
{
var p1 = new Point((point3.X - point1.X), (point3.Y - point1.Y));
var p2 = new Point((point2.X - point1.X), (point2.Y - point1.Y));
return p1.X * p2.Y - p1.Y * p2.X;
}
public static bool OnSegment(Point point1, Point point2, Point point3)
{
double xMin, xMax, yMin, yMax;
if (point1.X < point2.X)
{
xMin = point1.X;
xMax = point2.X;
}
else
{
xMin = point2.X;
xMax = point1.X;
}
if (point1.Y < point2.Y)
{
yMin = point1.Y;
yMax = point2.Y;
}
else
{
yMin = point2.Y;
yMax = point1.Y;
}
if (point3.X < xMin || point3.X > xMax || point3.Y < yMin || point3.Y > yMax)
return false;
else
return true;
}
public static bool SegmentIntersect(Point point1, Point point2, Point point3, Point point4)
{
var d1 = Direction(point3, point4, point1);
var d2 = Direction(point3, point4, point2);
var d3 = Direction(point1, point2, point3);
var d4 = Direction(point1, point2, point4);
if (d1 * d2 < 0 && d3 * d4 < 0)
return true;
if (Math.Abs(d1) < 0.00000000000001 && OnSegment(point3, point4, point1))
return true;
if (Math.Abs(d2) < 0.00000000000001 && OnSegment(point3, point4, point2))
return true;
if (Math.Abs(d3) < 0.00000000000001 && OnSegment(point1, point2, point3))
return true;
if (Math.Abs(d4) < 0.00000000000001 && OnSegment(point1, point2, point4))
return true;
else
return false;
}