//g++ 4.9.3
#include <iostream>
#include <cmath>
bool cross(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4){
float maxx1 = std::max(x1, x2), maxy1 = std::max(y1, y2);
float minx1 = std::min(x1, x2), miny1 = std::min(y1, y2);
float maxx2 = std::max(x3, x4), maxy2 = std::max(y3, x4);
float minx2 = std::min(x3, x4), miny2 = std::min(y3, x4);
if (minx1 > maxx2 || maxx1 < minx2 || miny1 > maxy2 || maxy1 < miny2)
return false; // Момент, кда линии имеют одну общую вершину...
float dx1 = x2-x1, dy1 = y2-y1; // Длина проекций первой линии на ось x и y
float dx2 = x4-x3, dy2 = y4-y3; // Длина проекций второй линии на ось x и y
float dxx = x1-x3, dyy = y1-y3;
float div, mul;
if ((div = (dy2*dx1 - dx2*dy1)) == 0)
return false; // Линии параллельны...
if (div > 0) {
if ((mul = (dx1*dyy - dy1*dxx)) < 0 || mul > div)
return false; // Первый отрезок пересекается за своими границами...
if ((mul = (dx2*dyy - dy2*dxx)) < 0 || mul > div)
return false; // Второй отрезок пересекается за своими границами...
}
if ((mul = -(dx1*dyy - dy1*dxx)) < 0 || mul > -div)
return false; // Первый отрезок пересекается за своими границами...
if ((mul = -(dx2*dyy - dy2*dxx)) < 0 || mul > -div)
return false; // Второй отрезок пересекается за своими границами...
return true;
}
bool transection (double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2)
{
double v1=(bx2-bx1)*(ay1-by1)-(by2-by1)*(ax1-bx1);
double v2=(bx2-bx1)*(ay2-by1)-(by2-by1)*(ax2-bx1);
double v3=(ax2-ax1)*(by1-ay1)-(ay2-ay1)*(bx1-ax1);
double v4=(ax2-ax1)*(by2-ay1)-(ay2-ay1)*(bx2-ax1);
return ((v1*v2<0) && (v3*v4<0));
}
int main()
{
std::cout << (cross(1, 1, 5, 5, 1, 2, 3, 1)? "true" : "false") << std::endl;
std::cout << (cross(1, 1, 1, 1, 1, 1, 1, 1)? "true" : "false") << std::endl;
std::cout << (cross(1, 1, 4, 1, 1, 1, 4, 1)? "true" : "false") << std::endl;
std::cout << (cross(0, 0, 0, 2, 0, 1, 1, 1)? "true" : "false") << std::endl;
std::cout << (transection(1, 1, 5, 5, 1, 2, 3, 1)? "true" : "false") << std::endl;
std::cout << (transection(1, 1, 1, 1, 1, 1, 1, 1)? "true" : "false") << std::endl;
std::cout << (transection(1, 1, 4, 1, 1, 1, 4, 1)? "true" : "false") << std::endl;
std::cout << (transection(0, 0, 0, 2, 0, 1, 1, 1)? "true" : "false") << std::endl;
return 0;
}
Ly9nKysgIDQuOS4zCiAKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiAKYm9vbCBjcm9zcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB4NCwgZmxvYXQgeTQpewogICAgCiAgICBmbG9hdCBtYXh4MSA9IHN0ZDo6bWF4KHgxLCB4MiksIG1heHkxID0gc3RkOjptYXgoeTEsIHkyKTsKICAgIGZsb2F0IG1pbngxID0gc3RkOjptaW4oeDEsIHgyKSwgbWlueTEgPSBzdGQ6Om1pbih5MSwgeTIpOwogICAgZmxvYXQgbWF4eDIgPSBzdGQ6Om1heCh4MywgeDQpLCBtYXh5MiA9IHN0ZDo6bWF4KHkzLCB4NCk7CiAgICBmbG9hdCBtaW54MiA9IHN0ZDo6bWluKHgzLCB4NCksIG1pbnkyID0gc3RkOjptaW4oeTMsIHg0KTsKICAgIAogICAgaWYgKG1pbngxID4gbWF4eDIgfHwgbWF4eDEgPCBtaW54MiB8fCBtaW55MSA+IG1heHkyIHx8IG1heHkxIDwgbWlueTIpCiAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8g0JzQvtC80LXQvdGCLCDQutC00LAg0LvQuNC90LjQuCDQuNC80LXRjtGCINC+0LTQvdGDINC+0LHRidGD0Y4g0LLQtdGA0YjQuNC90YMuLi4KICAgIAogICAgCiAgICBmbG9hdCBkeDEgPSB4Mi14MSwgZHkxID0geTIteTE7IC8vINCU0LvQuNC90LAg0L/RgNC+0LXQutGG0LjQuSDQv9C10YDQstC+0Lkg0LvQuNC90LjQuCDQvdCwINC+0YHRjCB4INC4IHkKICAgIGZsb2F0IGR4MiA9IHg0LXgzLCBkeTIgPSB5NC15MzsgLy8g0JTQu9C40L3QsCDQv9GA0L7QtdC60YbQuNC5INCy0YLQvtGA0L7QuSDQu9C40L3QuNC4INC90LAg0L7RgdGMIHgg0LggeQogICAgZmxvYXQgZHh4ID0geDEteDMsIGR5eSA9IHkxLXkzOwogICAgZmxvYXQgZGl2LCBtdWw7CiAgICAKICAgIAogICAgaWYgKChkaXYgPSAoZHkyKmR4MSAtIGR4MipkeTEpKSA9PSAwKSAKICAgICAgICByZXR1cm4gZmFsc2U7IC8vINCb0LjQvdC40Lgg0L/QsNGA0LDQu9C70LXQu9GM0L3Riy4uLgogICAgCiAgICBpZiAoZGl2ID4gMCkgewoJICAgIGlmICgobXVsID0gKGR4MSpkeXkgLSBkeTEqZHh4KSkgPCAwIHx8IG11bCA+IGRpdikKCSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyDQn9C10YDQstGL0Lkg0L7RgtGA0LXQt9C+0Log0L/QtdGA0LXRgdC10LrQsNC10YLRgdGPINC30LAg0YHQstC+0LjQvNC4INCz0YDQsNC90LjRhtCw0LzQuC4uLgoJICAgIGlmICgobXVsID0gKGR4MipkeXkgLSBkeTIqZHh4KSkgPCAwIHx8IG11bCA+IGRpdikKICAgIAkgcmV0dXJuIGZhbHNlOyAvLyDQktGC0L7RgNC+0Lkg0L7RgtGA0LXQt9C+0Log0L/QtdGA0LXRgdC10LrQsNC10YLRgdGPINC30LAg0YHQstC+0LjQvNC4INCz0YDQsNC90LjRhtCw0LzQuC4uLgogICAgfQogICAgCiAgICBpZiAoKG11bCA9IC0oZHgxKmR5eSAtIGR5MSpkeHgpKSA8IDAgfHwgbXVsID4gLWRpdikKICAgICAgICByZXR1cm4gZmFsc2U7IC8vINCf0LXRgNCy0YvQuSDQvtGC0YDQtdC30L7QuiDQv9C10YDQtdGB0LXQutCw0LXRgtGB0Y8g0LfQsCDRgdCy0L7QuNC80Lgg0LPRgNCw0L3QuNGG0LDQvNC4Li4uCiAgICBpZiAoKG11bCA9IC0oZHgyKmR5eSAtIGR5MipkeHgpKSA8IDAgfHwgbXVsID4gLWRpdikKICAgICAgICByZXR1cm4gZmFsc2U7IC8vINCS0YLQvtGA0L7QuSDQvtGC0YDQtdC30L7QuiDQv9C10YDQtdGB0LXQutCw0LXRgtGB0Y8g0LfQsCDRgdCy0L7QuNC80Lgg0LPRgNCw0L3QuNGG0LDQvNC4Li4uCgogICAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgdHJhbnNlY3Rpb24gKGRvdWJsZSBheDEsIGRvdWJsZSBheTEsIGRvdWJsZSBheDIsIGRvdWJsZSBheTIsIGRvdWJsZSBieDEsIGRvdWJsZSBieTEsIGRvdWJsZSBieDIsIGRvdWJsZSBieTIpCnsKICAgIGRvdWJsZSB2MT0oYngyLWJ4MSkqKGF5MS1ieTEpLShieTItYnkxKSooYXgxLWJ4MSk7CiAgICBkb3VibGUgdjI9KGJ4Mi1ieDEpKihheTItYnkxKS0oYnkyLWJ5MSkqKGF4Mi1ieDEpOwogICAgZG91YmxlIHYzPShheDItYXgxKSooYnkxLWF5MSktKGF5Mi1heTEpKihieDEtYXgxKTsKICAgIGRvdWJsZSB2ND0oYXgyLWF4MSkqKGJ5Mi1heTEpLShheTItYXkxKSooYngyLWF4MSk7CiAgICByZXR1cm4gKCh2MSp2MjwwKSAmJiAodjMqdjQ8MCkpOwp9CiAKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgKGNyb3NzKDEsIDEsIDUsIDUsIDEsIDIsIDMsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKGNyb3NzKDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKGNyb3NzKDEsIDEsIDQsIDEsIDEsIDEsIDQsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKGNyb3NzKDAsIDAsIDAsIDIsIDAsIDEsIDEsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKHRyYW5zZWN0aW9uKDEsIDEsIDUsIDUsIDEsIDIsIDMsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKHRyYW5zZWN0aW9uKDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKHRyYW5zZWN0aW9uKDEsIDEsIDQsIDEsIDEsIDEsIDQsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgKHRyYW5zZWN0aW9uKDAsIDAsIDAsIDIsIDAsIDEsIDEsIDEpPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIAogICAgCiAgICByZXR1cm4gMDsKfQ==