
Добавил:
lipton15
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:курсачи / Iskhodny_kod1
.cpp#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;
}
Соседние файлы в папке курсачи