bool IsLinesCross(int x11, int y11, int x12, int y12, int x21, int y21, int x22, int y22)
{
int maxx1 = std::max(x11, x12), maxy1 = std::max(y11, y12);
int minx1 = std::min(x11, x12), miny1 = std::min(y11, y12);
int maxx2 = std::max(x21, x22), maxy2 = std::max(y21, y22);
int minx2 = std::min(x21, x22), miny2 = std::min(y21, y22);
if (minx1 > maxx2 || maxx1 < minx2 || miny1 > maxy2 || maxy1 < miny2)
return false; // Момент, када линии имеют одну общую вершину...
int dx1 = x12-x11, dy1 = y12-y11; // Длина проекций первой линии на ось x и y
int dx2 = x22-x21, dy2 = y22-y21; // Длина проекций второй линии на ось x и y
int dxx = x11-x21, dyy = y11-y21;
int div, mul;
if ((div = (int)((double)dy2*dx1-(double)dx2*dy1)) == 0)
return false; // Линии параллельны...
if (div > 0) {
if ((mul = (int)((double)dx1*dyy-(double)dy1*dxx)) < 0 || mul > div)
return false; // Первый отрезок пересекается за своими границами...
if ((mul = (int)((double)dx2*dyy-(double)dy2*dxx)) < 0 || mul > div)
return false; // Второй отрезок пересекается за своими границами...
}
if ((mul = -(int)((double)dx1*dyy-(double)dy1*dxx)) < 0 || mul > -div)
return false; // Первый отрезок пересекается за своими границами...
if ((mul = -(int)((double)dx2*dyy-(double)dy2*dxx)) < 0 || mul > -div)
return false; // Второй отрезок пересекается за своими границами...
return true;
}
printf("%s\n", IsLinesCross(553,926, 557,940, 202,929, 1129,929) ? "true" : "false");
printf("%s\n", IsLinesCross(202,929, 1129,929, 553,926, 557,940) ? "true" : "false"); |