Here invented a way to check the intersection of 2D shapes of any shape. It can be easily redone (the checkCrossing function) in order to find out how many times one shape crosses the other and where it crosses the coordinates. I don’t know how effective such an algorithm is.
#include <iostream> #include <vector> using namespace std; struct point{ double x, y; bool operator == (const point p){ if ((x == px) && (y == py)) return true; else return false; } } p; vector<point> buf; void linesArray(double x1, double y1, double x2, double y2) { const double deltaX = abs(x2 - x1); const double deltaY = abs(y2 - y1); const double signX = x1 < x2 ? 1 : -1; const double signY = y1 < y2 ? 1 : -1; double error = deltaX - deltaY; px = x2; py = y2; buf.push_back(p); while(x1 != x2 || y1 != y2) { px = x1; py = y1; buf.push_back(p); const double error2 = error * 2; if(error2 > -deltaY) { error -= deltaY; x1 += signX; } if(error2 < deltaX) { error += deltaX; y1 += signY; } } } bool checkCrossing(){ // функция вернет истину если один многоугольник пересекается с другим for (unsigned int i = 0; i < buf.size(); i++){ for (unsigned int j = 0; j < buf.size(); j++){ if ((buf[i] == buf[j]) && (i != j)) return true; } } return false; } int main() { // загружаем стороны 1 многоугольника linesArray(1.0, 1.0, 2.0, 2.0); // A и B linesArray(2.0, 2.0, 3.0, 4.0); // B и C linesArray(3.0, 4.0, 1.0, 1.0); // C и A // загружаем стороны 2 многоугольника linesArray(2.0, 1.0, 1.0, 3.0); // D и E linesArray(1.0, 3.0, 3.0, 3.0); // E и F linesArray(3.0, 3.0, 2.0, 1.0); // F и D // проверяем на пересечение if (checkCrossing()) cout << "yes crossing" << endl; else cout << "No crossing" << endl; buf.clear(); // ещо проверка (тест - должно совпасть) linesArray(1.0, 0.0, -1.0, 0.0); linesArray(0.0, -1.0, 0.0, 1.0); // проверяем на пересечение if (checkCrossing()) cout << "yes crossing" << endl; else cout << "No crossing" << endl; buf.clear(); // ещо проверка (тест - не должно совпасть) linesArray(1.0, -1.0, -1.0, -1.0); linesArray(1.0, 1.0, -1.0, 1.0); // проверяем на пересечение if (checkCrossing()) cout << "yes crossing" << endl; else cout << "No crossing" << endl; return 0; }
_NEW FIXED CODE _ _ _ _ _ __
#include <iostream> #include <vector> using namespace std; struct point{ double x, y; bool operator == (const point p){ if ((x == px) && (y == py)) return true; else return false; } } p; vector<point> buf; void round (double & x, int precision){ // ДОБАВЛЕНО int res = 1; for (int i = 0; i < precision; i++){ res *= 10; } x = x * res; } // точьность (сколько знаков после запятой)!!!! void linesArray(double x1, double y1, double x2, double y2, int precision = 1) { round(x1, precision); // ДОБАВЛЕНО round(y1, precision); // ДОБАВЛЕНО round(x2, precision); // ДОБАВЛЕНО round(y2, precision); // ДОБАВЛЕНО const double deltaX = abs(x2 - x1); const double deltaY = abs(y2 - y1); const double signX = x1 < x2 ? 1 : -1; const double signY = y1 < y2 ? 1 : -1; double error = deltaX - deltaY; px = x2; py = y2; buf.push_back(p); while((x1 != x2) || (y1 != y2)) { px = x1; py = y1; buf.push_back(p); const double error2 = error * 2; if(error2 > -deltaY) { error -= deltaY; x1 += signX; } if(error2 < deltaX) { error += deltaX; y1 += signY; } } } bool checkCrossing(){ // функция вернет истину если один многоугольник пересекается с другим for (unsigned int i = 0; i < buf.size(); i++){ for (unsigned int j = 0; j < buf.size(); j++){ if ((buf[i] == buf[j]) && (i != j)) return true; } } return false; } int main() { // загружаем стороны 1 многоугольника linesArray(1.0, 1.0, 2.0, 2.0); // A и B linesArray(2.0, 2.0, 3.0, 4.0); // B и C linesArray(3.0, 4.0, 1.0, 1.0); // C и A // загружаем стороны 2 многоугольника linesArray(2.3, 1.3, 1.0, 3.0); // D и E linesArray(1.0, 3.0, 3.0, 3.0); // E и F linesArray(3.0, 3.0, 2.3, 1.3); // F и D // проверяем на пересечение if (checkCrossing()) cout << "yes crossing" << endl; else cout << "No crossing" << endl; buf.clear(); // ещо проверка (тест - должно совпасть) linesArray(1.0, 0.0, -1.0, 0.0); linesArray(0.0, -1.0, 0.0, 1.0); // проверяем на пересечение if (checkCrossing()) cout << "yes crossing" << endl; else cout << "No crossing" << endl; buf.clear(); // ещо проверка (тест - не должно совпасть) linesArray(1.0, -1.0, -1.0, -1.0); linesArray(1.0, 1.0, -1.0, 1.0); // проверяем на пересечение if (checkCrossing()) cout << "yes crossing" << endl; else cout << "No crossing" << endl; return 0; }