Скачиваний:
4
Добавлен:
28.04.2022
Размер:
8.82 Кб
Скачать
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <math.h>

using namespace std;

struct point{
    double px;
    double py;
    bool   pen;
};
struct otrezok{
    point  p1;
    point  p2;
    point  middle;
    bool   oEn;
};

vector<otrezok> finalsegments;
vector<otrezok> otr;
vector<otrezok> initsegments2;

bool pointInSegment(point& p, otrezok& o){
    bool otv = false;
    if((p.px == o.p1.px) && (p.py == o.p1.py))
        otv = true;
    if((p.px == o.p2.px) && (p.py == o.p2.py))
        otv = true;
    return otv;
}

double lenght(point& a, point& b){
    return sqrt(pow((a.px-b.px),2) + pow((a.py-b.py),2));
}

bool samePoint(point& a, point& b){
    return (a.px == b.px) && (a.py == b.py);
}

bool sameOtr(otrezok& a, otrezok& b){
    return (a.p1.px == b.p1.px) && (a.p1.py == b.p1.py) && (a.p2.px == b.p2.px) && (a.p2.py == b.p2.py)
            || (a.p1.px == b.p2.px) && (a.p1.py == b.p2.py) && (a.p2.px == b.p1.px) && (a.p2.py == b.p1.py);
}

bool findOtrezok(point& a, point& b){
    otrezok t;
    t.p1 = a;
    t.p2 = b;
    int j = 0;
    for(int i = 0; i<finalsegments.size();i++){
        if(sameOtr(t, finalsegments.at(i))){
            j++;
        }
    }
    if(j!=0){
        return true;
    }
    return false;
}

bool intersection(otrezok& a, otrezok& b){
    double v1,v2,v3,v4;
    v1=(b.p2.px-b.p1.px)*(a.p1.py-b.p1.py)-(b.p2.py-b.p1.py)*(a.p1.px-b.p1.px);
    v2=(b.p2.px-b.p1.px)*(a.p2.py-b.p1.py)-(b.p2.py-b.p1.py)*(a.p2.px-b.p1.px);
    v3=(a.p2.px-a.p1.px)*(b.p1.py-a.p1.py)-(a.p2.py-a.p1.py)*(b.p1.px-a.p1.px);
    v4=(a.p2.px-a.p1.px)*(b.p2.py-a.p1.py)-(a.p2.py-a.p1.py)*(b.p2.px-a.p1.px);
    return (v1*v2<0) && (v3*v4<0);
}

bool findSegment(otrezok* a){
    double tlen = 1000000000;
    point tpoint;
    bool find = false;
    otrezok *b = new otrezok; otrezok *c = new otrezok;
    if(a->oEn){
        for(int i = 0; i<otr.size();i++){
            if( (lenght(a->middle, otr.at(i).p1) < tlen)
                    && !samePoint(a->p1, otr.at(i).p1)
                    && !samePoint(a->p2, otr.at(i).p1)
                    && !findOtrezok(a->p1, otr.at(i).p1)
                    && !findOtrezok(a->p2, otr.at(i).p1)){
                tlen = lenght(a->middle, otr.at(i).p1);
                tpoint = otr.at(i).p1;
                find = true;
            }
            if( (lenght(a->middle, otr.at(i).p2) < tlen)
                    && !samePoint(a->p1, otr.at(i).p2)
                    && !samePoint(a->p2, otr.at(i).p2)
                    && !findOtrezok(a->p1, otr.at(i).p2)
                    && !findOtrezok(a->p2, otr.at(i).p2) ){
                tlen = lenght(a->middle, otr.at(i).p2);
                tpoint = otr.at(i).p2;
                find = true;
            }
        }
    }
    if(find){
        int pb = 0;
        int pc = 0;
        b->p1 = tpoint;
        c->p1 = tpoint;
        b->p2 = a->p1;
        c->p2 = a->p2;
        a->oEn = false;
        for(int i = 0; i<finalsegments.size();i++){
            if(intersection(*b,finalsegments.at(i))){
                pb++;
            }
        }
        if(pb==0){
            finalsegments.push_back(*b);
            int fb = 0;
            for(int i = 0; i<finalsegments.size();i++){
                if(sameOtr(*b,finalsegments.at(i))){
                    fb++;
                }
            }
            if(fb == 1){
                double xc = (b->p1.px+b->p2.px)/2;
                double yc = (b->p1.py+b->p2.py)/2;
                point tv;
                tv.px = xc;
                tv.py = yc;
                b->middle=tv;
                b->oEn = true;
                findSegment(b);
            }
        }
        for(int i = 0; i<finalsegments.size();i++){
            if(intersection(*c,finalsegments.at(i))){
                pc++;
            }
        }
        if(pc==0){
            finalsegments.push_back(*c);
            int fc = 0;
            for(int i = 0; i<finalsegments.size();i++){
                if(sameOtr(*c,finalsegments.at(i))){
                    fc++;
                }
            }
            if(fc == 1){
                double xc = (c->p1.px+c->p2.px)/2;
                double yc = (c->p1.py+c->p2.py)/2;
                point tv;
                tv.px = xc;
                tv.py = yc;
                c->middle=tv;
                c->oEn = true;
                findSegment(c);
            }
        }
    }
    return find;
}


bool otrezokIn(point& a){
    int per = 0;
    otrezok tm;
    tm.p1 = a;
    point ta;
    ta.px = 100000;
    ta.py = 100000;
    tm.p2 = ta;
    for(int i = 0; i<initsegments2.size();i++){
        if(intersection(tm, initsegments2.at(i)))
            per++;
    }
    if(per == 1 || per == 3 || per == 5){
        return true;
    }
    return false;
}

int main()
{
    FILE *file;
    vector<string> vec;
    vector<point> points;
    char line[100];
    std::string tmp;
    if( fopen_s( &file, C:\\Users\\Ярослав\\Documents\\file.txt, "r" ) == 0 )
    {
        vector<otrezok>* pSeg;
        pSeg = &otr;
        int i = 0;
        int rf = 0;
        bool second = false;
        while(fgets( line, 100, file ) != NULL){
            tmp.append(line);
            vec.push_back(tmp);
            if(tmp.at(0) != '='){
                string::size_type sz;
                point a;
                a.px = stod(tmp,&sz);
                a.py = stod(tmp.substr(sz));
                points.push_back(a);
//                cout << "x: " << a.px << " y: " << a.py << endl;
                if(points.size() != 0 && i>0){
                    otrezok a;
                    a.p1 = points.at(i-1);
                    a.p2 = points.at(i);
                    a.oEn = true;
                    if(rf == 0){
                        pSeg->push_back(a);
                        if(second){
                            initsegments2.push_back(a);
                        }
                    }
                    rf = 0;
                }
                i++;
            }else{
                second = true;
                rf = 1;
            }
            tmp.clear();
        }
    }
    for(int i = 0; i<otr.size();i++){
        point a;
        a.px = (otr.at(i).p1.px + otr.at(i).p2.px)/2;
        a.py = (otr.at(i).p1.py + otr.at(i).p2.py)/2;
        otr.at(i).middle = a;
    }
    for(int i = 0; i<initsegments2.size();i++){
        point a;
        a.px = (initsegments2.at(i).p1.px + initsegments2.at(i).p2.px)/2;
        a.py = (initsegments2.at(i).p1.py + initsegments2.at(i).p2.py)/2;
        initsegments2.at(i).middle = a;
    }
    finalsegments.push_back(otr.at(0));
    bool end = findSegment(&otr.at(0));


    for(int pi = 0;pi<points.size();pi++){
        for(int pj = 0;pj<points.size();pj++){
            if(pj!=pi){
                otrezok tm;
                tm.p1 = points.at(pi);
                tm.p2 = points.at(pj);
                int sov = 0;
                int per = 0;
                for(int i = 0; i<finalsegments.size();i++){
                    if(sameOtr(tm, finalsegments.at(i)))
                        sov++;
                }
                for(int i = 0; i<finalsegments.size();i++){
                    if(intersection(tm, finalsegments.at(i)))
                        per++;
                }
                if(sov==0&&per==0){
                    finalsegments.push_back(tm);
                }
            }
        }
    }

    for(int i = 0; i<finalsegments.size();i++){
        double xc = (finalsegments.at(i).p1.px+finalsegments.at(i).p2.px)/2;
        double yc = (finalsegments.at(i).p1.py+finalsegments.at(i).p2.py)/2;
        point tv;
        tv.px = xc;
        tv.py = yc;
        bool same = false;
        if(otrezokIn(tv)){
            for(int j = 0; j<initsegments2.size();j++){
                if(sameOtr(finalsegments.at(i), initsegments2.at(j)))
                    same = true;
            }
            if(!same){
                finalsegments.erase(finalsegments.begin()+i);
                i--;
            }
        }
    }
    ofstream myfile ("out.txt");
    if (myfile.is_open())
    {
        for(int i = 0; i<finalsegments.size();i++){
            myfile << finalsegments.at(i).p1.px << "\t" << finalsegments.at(i).p1.py << "\t"
                   << finalsegments.at(i).p2.px << "\t" << finalsegments.at(i).p2.py << "\t" << endl;
        }
        myfile.close();
    }
    else cout << "Unable to open file";
    system("pause");
    return 0;
}

Соседние файлы в папке курсачи