Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <fstream>
- #include <ctime>
- using namespace std;
- struct Point{
- double x, y;
- Point(){
- x = 0;
- y = 0;
- }
- };
- struct Line{ // структура линии, впоследствии, луча;
- double k, b;
- Point A;
- Line(){
- A.x = 0;
- A.y = 0;
- k = 0;
- b = 0;
- }
- };
- Line getl(Point a, Point b);
- bool pocr(Line L, Point C);
- Point centre(Point A, Point B);
- int sravnx(Point A, Point B);
- int sravny(Point A, Point B);
- Point point_crossing(Point a1, Point a2, Point b1, Point b2);
- int check_top(Point A, Point B);
- bool pocr1(Point a1, Point a2, Point C);
- int main(int argc, char **argv){
- if (argc < 2){
- cout << "Error: not enpugh input arguments" << endl;
- return 1; // на случай, если в командную строку не ввели название файла
- }
- ifstream fin;
- ofstream fout;
- fin.open(argv[1]);
- fout.open(argv[2]); // открывает файл с координатами и количеством точеr
- if (!fin.is_open()){ // в случае, если файл не открылся
- cout << "Error: can't open the file" << endl;
- return 1;
- }
- int pol1, pol2; // количество вершин перовго и второго многоугольников
- fin >> pol1 >> pol2; // считывает количество вершин первого и второго многоугольников из файла
- int pol3 = pol1 + pol2;
- int m = 0; // счетчик правильных точек пересечения
- Point *polygon1 = new Point[pol1]; // массив вершин первого многоугольника
- Point *polygon2 = new Point[pol2]; // массив вершин второго многоугольника
- for (int i = 0; i < pol1; i++){
- fin >> polygon1[i].x; // по очереди считывает строки с данными из файла
- fin >> polygon1[i].y;
- }
- for (int i = 0; i < pol2; i++){ // заполнение массивов вершин многоугольников
- fin >> polygon2[i].x;
- fin >> polygon2[i].y;
- }
- int mesto = 0; // результат sravnx
- Point pointN1, pointN2;
- Point *pointCross1 = new Point[pol1];
- Point *pointCross2 = new Point[pol2];
- Point *center1 = new Point[pol1];
- Point *center2 = new Point[pol2];
- center1[pol1 - 1] = centre(polygon1[pol1 - 1], polygon1[0]);
- center2[pol2 - 1] = centre(polygon2[pol2 - 1], polygon2[0]);
- for (int i = 0; i < pol1 - 1; i++)
- center1[i] = centre(polygon1[i], polygon1[i + 1]);
- for (int i = 0; i < pol2 - 1; i++)
- center2[i] = centre(polygon2[i], polygon2[i + 1]);
- /*for (int i=0;i<pol1;i++)
- cout << center1[i].x << " " << center1[i].y << endl;
- cout << "centre 2"<< endl;
- for (int i=0;i<pol2;i++)
- cout << center2[i].x << " " << center2[i].y << endl;*/
- Line test;
- for (int i = 0; i < pol2; i++){
- int z = 0;
- while (z < pol1){
- int flag = 0;
- test = getl(polygon2[i], center1[z]);
- cout << "new:" << endl;
- cout << "polygon2[" << i << "]:";
- cout << polygon2[i].x << " " << polygon2[i].y << endl;
- cout << "center1[" << z << "]:";
- cout << center1[z].x << " " << center1[z].y << endl;
- if (sravnx(center1[z], polygon2[i]) == 2)
- cout << "x=" << polygon2[i].x << endl;
- //тут добавить sravny(2 раза, для каждой sravnx)
- if (sravnx(center1[z], polygon2[i]) == 1)
- cout << "x>" << polygon2[i].x << endl;
- if (sravnx(center1[z], polygon2[i]) == 0)
- cout << "x<" << polygon2[i].x << endl;
- cout << "y=" << test.k << "*x+" << test.b << endl;
- for (int j = 0; j < pol1; j++){
- //cout << " polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
- //cout << "ysl: " << sravnx(center1[z],polygon2[i]) << "~" << polygon2[i].x << " " << polygon1[j].y << "==" << test.k*polygon1[j].x+test.b << endl;
- if (sravnx(center1[z], polygon2[i]) == 2)
- if ((polygon1[j].x == polygon2[i].x) && (polygon1[j].y == test.k*polygon1[j].x + test.b)){
- flag = 1;
- //cout << "lol polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
- break;
- }
- //тут добавить sravny(2 раза, для каждой sravnx)
- if (sravnx(center1[z], polygon2[i]) == 1)
- if ((polygon1[j].x > polygon2[i].x) && (polygon1[j].y == test.k*polygon1[j].x + test.b)){
- flag = 1;
- //cout << "lol polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
- break;
- }
- if (sravnx(center1[z], polygon2[i]) == 0)
- if ((polygon1[j].x < polygon2[i].x) && (polygon1[j].y == test.k*polygon1[j].x + test.b)){
- flag = 1;
- //cout << "lol polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
- break;
- }
- }
- mesto = sravnx(center1[z], polygon2[i]);
- //добавить вторую переменную (mestoy), изменить прошлую на mestox, mestoy заолнять так: есть sravnx!=2,то хуй забить, если =2, то ебашить функцию
- cout << endl;
- if (flag == 1)
- z++;
- if (flag == 0){
- pointN1 = center1[z];
- pointN2 = polygon2[i];
- break;
- }
- }
- fout << "AZAZ: " << pointN2.x << " " << pointN2.y << "\t" << pointN1.x << " " << pointN1.y << "\t" << "x " << mesto << " " << polygon2[i].x << endl << endl;
- pointCross1[pol1 - 1] = point_crossing(pointN1, pointN2, polygon1[pol1 - 1], polygon1[0]);
- //cout << pocr1(polygon1[pol1-1],polygon1[0],pointCross1[pol1-1]) << endl;
- if (pocr1(polygon1[pol1 - 1], polygon1[0], pointCross1[pol1 - 1]) == false){
- pointCross1[pol1 - 1].x = 9999999;
- pointCross1[pol1 - 1].y = 9999999;
- }
- if (mesto == 2)
- if (pointCross1[pol1 - 1].x == polygon2[i].x){
- pointCross1[pol1 - 1].x = 9999999;
- pointCross1[pol1 - 1].y = 9999999;
- //тут добавить sravny(2 раза, для каждой sravnx)
- if (mesto == 1)
- if (pointCross1[pol1 - 1].x <= polygon2[i].x){
- pointCross1[pol1 - 1].x = 9999999;
- pointCross1[pol1 - 1].y = 9999999;
- }
- if (mesto == 0)
- if (pointCross1[pol1 - 1].x >= polygon2[i].x){
- pointCross1[pol1 - 1].x = 9999999;
- pointCross1[pol1 - 1].y = 9999999;
- }
- for (int f = 0; f < pol1 - 1; f++){
- pointCross1[f] = point_crossing(pointN1, pointN2, polygon1[f], polygon1[f + 1]);
- if (pocr1(polygon1[f], polygon1[f + 1], pointCross1[f]) == false){
- pointCross1[f].x = 9999999;
- pointCross1[f].y = 9999999;
- }
- if (mesto == 2)
- if (pointCross1[f].x == polygon2[i].x){
- pointCross1[f].x = 9999999;
- pointCross1[f].y = 9999999;
- }
- //тут добавить sravny(2 раза, для каждой sravnx)
- //cout << "CHECK " << pointCross1[f].x << " " << mesto << " " << polygon2[i].x<<endl;
- if (mesto == 1)
- if (pointCross1[f].x <= polygon2[i].x){
- pointCross1[f].x = 9999999;
- pointCross1[f].y = 9999999;
- }
- if (mesto == 0)
- if (pointCross1[f].x >= polygon2[i].x){
- pointCross1[f].x = 9999999;
- pointCross1[f].y = 9999999;
- }
- }
- for (int f = 0; f < pol1; f++)
- fout << pointCross1[f].x << " " << pointCross1[f].y << endl;
- fout << endl;
- }
- //вот тут проверить check_top pointCross1 с вершинами polygon2
- fout << "-----------------------------------------------" << endl << "-----------------------------------------------" << endl;
- for (int i = 0; i < pol1; i++){
- int z = 0;
- while (z < pol2){
- int flag = 0;
- test = getl(polygon1[i], center2[z]);
- cout << "new:" << endl;
- cout << "polygon1[" << i << "]:";
- cout << polygon1[i].x << " " << polygon1[i].y << endl;
- cout << "center2[" << z << "]:";
- cout << center2[z].x << " " << center2[z].y << endl;
- if (sravnx(center2[z], polygon1[i]) == 2)
- cout << "x=" << polygon1[i].x << endl;
- if (sravnx(center2[z], polygon1[i]) == 1)
- cout << "x>" << polygon1[i].x << endl;
- if (sravnx(center2[z], polygon1[i]) == 0)
- cout << "x<" << polygon1[i].x << endl;
- cout << "y=" << test.k << "*x+" << test.b << endl;
- for (int j = 0; j < pol2; j++){
- //cout << " polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
- //cout << "ysl: " << sravnx(center2[z],polygon1[i]) << "~" << polygon1[i].x << " " << polygon2[j].y << "==" << test.k*polygon2[j].x+test.b << endl;
- if (sravnx(center2[z], polygon1[i]) == 2)
- if ((polygon2[j].x == polygon1[i].x) && (polygon2[j].y == test.k*polygon2[j].x + test.b)){
- flag = 1;
- //cout << "lol polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
- break;
- }
- //тут добавить sravny(2 раза, для каждой sravnx)
- if (sravnx(center2[z], polygon1[i]) == 1)
- if ((polygon2[j].x > polygon1[i].x) && (polygon2[j].y == test.k*polygon2[j].x + test.b)){
- flag = 1;
- //cout << "lol polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
- break;
- }
- if (sravnx(center2[z], polygon1[i]) == 0)
- if ((polygon2[j].x < polygon1[i].x) && (polygon2[j].y == test.k*polygon2[j].x + test.b)){
- flag = 1;
- //cout << "lol polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
- break;
- }
- }
- mesto = sravnx(center2[z], polygon1[i]);
- //cout << "CHECK " << pointCross1[f].x << " " << mesto << " " << polygon2[i].x<<endl;
- cout << endl;
- if (flag == 1) // если вершина не найдена, то подставляем следующую
- z++;
- if (flag == 0){
- pointN1 = center2[z];
- pointN2 = polygon1[i];
- break;
- }
- }
- fout << "AZAZ: " << pointN2.x << " " << pointN2.y << "\t" << pointN1.x << " " << pointN1.y << "\t" << "x " << mesto << " " << polygon1[i].x << endl << endl;
- pointCross2[pol2 - 1] = point_crossing(pointN1, pointN2, polygon2[pol2 - 1], polygon2[0]);
- //cout << pocr1(polygon2[pol2-1],polygon2[0],pointCross2[pol2-1]) << endl;
- if (pocr1(polygon2[pol2 - 1], polygon2[0], pointCross2[pol2 - 1]) == false){
- pointCross2[pol2 - 1].x = 111;
- pointCross2[pol2 - 1].y = 112;
- }
- if (mesto == 2)
- if (pointCross2[pol2 - 1].x == polygon1[i].x){
- pointCross2[pol2 - 1].x = 121;
- pointCross2[pol2 - 1].y = 122;
- }
- //тут добавить sravny(2 раза, для каждой sravnx)
- if (mesto == 1)
- if (pointCross2[pol2 - 1].x <= polygon1[i].x){
- pointCross2[pol2 - 1].x = 131;
- pointCross2[pol2 - 1].y = 132;
- }
- if (mesto == 0)
- if (pointCross2[pol2 - 1].x >= polygon1[i].x){
- pointCross2[pol2 - 1].x = 141;
- pointCross2[pol2 - 1].y = 142;
- }
- for (int f = 0; f < pol2 - 1; f++){
- pointCross2[f] = point_crossing(pointN1, pointN2, polygon2[f], polygon2[f + 1]);
- if (pocr1(polygon2[f], polygon2[f + 1], pointCross2[f]) == false){
- pointCross2[f].x = 211;
- pointCross2[f].y = 211;
- }
- if (mesto == 2)
- if (pointCross2[f].x == polygon1[i].x){
- pointCross2[f].x = 221;
- pointCross2[f].y = 222;
- }
- //тут добавить sravny(2 раза, для каждой sravnx)
- //cout << "CHECK " << pointCross1[f].x << " " << mesto << " " << polygon2[i].x<<endl;
- if (mesto == 1)
- if (pointCross2[f].x <= polygon1[i].x){
- pointCross2[f].x = 231;
- pointCross2[f].y = 232;
- }
- if (mesto == 0)
- if (pointCross2[f].x >= polygon1[i].x){
- pointCross2[f].x = 241;
- pointCross2[f].y = 242;
- }
- }
- for (int f = 0; f < pol2; f++)
- fout << pointCross2[f].x << " " << pointCross2[f].y << endl;
- fout << endl;
- }
- //вот тут проверить check_top pointCross2 с вершинами polygon1
- fin.close();
- fout.close();
- system("pause");
- return 0;
- }
- }
- Line getl(Point a, Point b){
- Line L1;
- L1.k = (b.y - a.y) / (b.x - a.x);
- L1.b = a.y - (b.y - a.y) / (b.x - a.x)*a.x;
- return L1;
- }
- bool pocr(Line L, Point C){
- if (C.y == L.k*C.x + L.b)
- return true;
- else return false;
- }
- Point centre(Point A, Point B){
- Point C;
- C.x = (A.x + B.x) / 2;
- C.y = (A.y + B.y) / 2;
- return C;
- }
- int sravnx(Point A, Point B){ // 0 - правее, 1 - левее, 2 равно
- if (A.x == B.x)
- return 2;
- if (A.x > B.x)
- return 1;
- if (A.x < B.x)
- return 0;
- }
- int sravny(Point A, Point B){ // 0 - выше, 1 - ниже
- if (A.y > B.y)
- return 1;
- if (A.y < B.y)
- return 0;
- }
- int check_top(Point A, Point B){
- if ((A.x == B.x) && (A.y==B.y))
- return 1;
- else
- return 0;
- }
- Point point_crossing(Point a1, Point a2, Point b1, Point b2){// выводит точку пересечения прямых
- Point cross; // точка пересечения прямых
- double x1, y1, x2, y2, x3, y3, x4, y4, k, b, m, n;
- x1 = a1.x; y1 = a1.y;
- x2 = a2.x; y2 = a2.y;
- x3 = b1.x; y3 = b1.y;
- x4 = b2.x; y4 = b2.y;
- k = (y1 - y2) / (x1 - x2);
- b = y1 - x1*k;
- m = (y3 - y4) / (x3 - x4);
- n = y3 - x3*m;
- if ((x1 == x2) && (y1 != y2) && (y3 != y4) && (x3 != x4)){ // рассмотрим случаи, при которых точка пересечения не может быть найдена или не работает формула: 1) |/
- cross.x = x1;
- cross.y = m*x1 + n;
- }
- else if ((x1 != x2) && (y1 != y2) && (y3 != y4) && (x3 == x4)){ // 2) \|
- cross.x = x3;
- cross.y = k*x3 + b;
- }
- else if ((x1 == x2) && (y1 != y2) && (y3 != y4) && (x3 == x4)){ // 3) ||
- cross.x = pow(10, 10);
- cross.y = pow(10, 10);
- }
- else if ((x1 != x2) && (y1 == y2) && (y3 == y4) && (x3 != x4)){ // 4) =
- cross.x = pow(10, 10);
- cross.y = pow(10, 10);
- }
- else if ((x1 != x2) && (y1 == y2) && (y3 != y4) && (x3 == x4)){ // 5) -|
- cross.x = x3;
- cross.y = y1;
- }
- else if ((x1 == x2) && (y1 != y2) && (y3 == y4) && (x3 != x4)){ // 6) |-
- cross.x = x1;
- cross.y = y3;
- }
- else{ // 7) \/
- cross.x = ((y1 - y3 - (x1*(y1 - y2)) / (x1 - x2) + (x3*(y3 - y4)) / (x3 - x4)) / ((y3 - y4) / (x3 - x4) - (y1 - y2) / (x1 - x2)));
- cross.y = ((y1 - y2) / (x1 - x2)*cross.x + y1 - (x1*(y1 - y2) / (x1 - x2)));
- }
- //cout << "CHECK " << a1.x << " " << a1.y << "\t" << a2.x << " " << a2.y << "\t" << b1.x << " " << b1.y << "\t" << b2.x << " " << b2.y << endl;
- //cout << "ANSWER " << cross.x << " " << cross.y << endl;
- return cross;
- }
- bool pocr1(Point a1, Point a2, Point C){ // определяет, лежит ли найденная точка пересечения на ребрах многоугольников
- bool T = false;
- double line1, dis11, dis12;
- //cout << "CHECK1 " << a1.x<< " " << a1.y << "\t" << a2.x << " " << a2.y << "\t" << C.x << " " << C.y<< endl;
- line1 = sqrt((pow((a1.x - a2.x), 2)) + (pow((a1.y - a2.y), 2)));
- dis11 = sqrt((pow((a1.x - C.x), 2)) + (pow((a1.y - C.y), 2)));
- dis12 = sqrt((pow((a2.x - C.x), 2)) + (pow((a2.y - C.y), 2)));
- //cout << "CHECK2 " << (dis11 + dis12) << "=" << (line1) << endl;
- if (abs(dis11 + dis12 - line1)<0.001)
- if (round(dis11 + dis12) == round(line1))
- T = true;
- else
- if ((dis11 + dis12) == (line1))
- T = true;
- return T;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement