Здравствуйте, я тут пока еще новичок, поэтому пишу тут. Народ, помогите реализовать Алгоритм поиска квадратов на плоскости. Мое задание таково: Дано множество точек на плоскости. Среди них необходимо выбрать такие, которые будут являться вершинами квадратов и среди этих квадратов найти квадрат с наибольшим периметром. Вариант моего решения | Код | #include <iostream.h> #include <fstream.h> #include <process.h> #include <conio.h> #include <math.h> #include <dos.h> #include <iomanip.h>
const int capacity=100;
double CalcLength(float* p1,float* p2) { return sqrt( pow(*p1-*p2,2) + pow(*(p1+1)-*(p2+1),2) ); }
int S(float* p1, float* p2, float* p3, float* p4) {ofstream log; log.open("log.txt",ios::app); double Length[6]; int Sides[4];
log<<"nahodim dliny do tochek"<<endl; Length[0]=CalcLength(p1,p2); log<<"Length0="<<Length[0]<<endl; Length[1]=CalcLength(p1,p3); log<<"Length1="<<Length[1]<<endl; Length[2]=CalcLength(p1,p4); log<<"Length2="<<Length[2]<<endl; Length[3]=CalcLength(p2,p3); log<<"Length3="<<Length[3]<<endl; Length[4]=CalcLength(p2,p4); log<<"Length4="<<Length[4]<<endl; Length[5]=CalcLength(p3,p4); log<<"Length5="<<Length[5]<<endl;
int count;
for(int i=0; i<3; i++) { count=0; log<<"vipolnyaem proverki"<<endl; Sides[count]=i; log<<"sides["<<count<<"]="<<Sides[count]<<endl; for(int j=i+1; j<6;j++) { if(Length[i]==Length[j]) { count++; Sides[count]=j;log<<"sides["<<count<<"]="<<Sides[count]<<endl; } }
if(count==3) { int a=-1, b; for(int q=0; q<6; q++) { if(q==Sides[3-count]) {count--;log<<"count="<<count<<endl;} else {(a==-1)?a=q:b=q;log<<"a="<<a<<endl;} }
if(Length[a]==Length[b]) { return Length[i]*4; } else return 0;
}
} return 0; }
int Square(float* ArrStart, float* Res, int&length) { ofstream log; log.open("log.txt",ios::app); float* ArrEnd=ArrStart+2*length; float Max=0;int tmp=0; int answers=0;
for(float* p1=ArrStart; p1<=ArrEnd-6; p1+=2) for(float* p2=p1+2; p2<=ArrEnd-4; p2+=2) for(float* p3=p2+2; p3<=ArrEnd-2; p3+=2) for(float* p4=p3+2; p4<=ArrEnd; p4+=2) { tmp=S(p1,p2,p3,p4); log<<"tmp="<<tmp<<endl; if (tmp!=0){log<<"Kvadrat sushestvuet"<<endl;}else {log<<"Kvadratas nema"<<endl;} if(tmp>=Max) { if(tmp==Max) { answers++; log<<"answers="<<answers<<endl;} else { answers=0; Max=tmp;log<<"max="<<Max<<endl;log<<"answers="<<answers<<endl;}
tmp=8*answers; log<<"Tmp="<<tmp<<endl; *(Res+tmp)=*p1; *(Res+tmp+1)=*(p1+1); *(Res+tmp+2)=*p2; *(Res+tmp+3)=*(p2+1); *(Res+tmp+4)=*p3; *(Res+tmp+5)=*(p3+1); *(Res+tmp+6)=*p4; *(Res+tmp+7)=*(p4+1);
}
}
length=answers+1; log<<"max="<<Max<<endl; return Max; }
int Input(float* ArrStart, int cap) { ofstream log; log.open("log.txt",ios::app); ifstream IN; IN.open("in.txt");
if(IN.bad()) { cout<<"Bad file"; IN.close(); getch(); exit; }
do{ IN>>*ArrStart; ArrStart++; IN>>*ArrStart; ArrStart++;
cap--; } while (!IN.eof()&&cap>0); IN.close();
return capacity-cap-2; }
void Output(float* ArrStart, int length, int S) { ofstream log;log.open("log.txt",ios::app); ofstream OF; OF.open("out.txt");
OF<<"Perimetr kvadrata(ov)= "<<S<<"\r\n"; log<<"Perimetr kvadrata(ov)= "<<S<<"\r\n"; OF<<"Kvadrat(y) zadan(y) tochkami:\r\n"; log<<"Kvadrat(y) zadan(y) tochkami:\r\n"; for(int i=0; i<length; i++) { OF<<"("<<*ArrStart<<";"; log<<"("<<*ArrStart<<";"; ArrStart++; OF<<*ArrStart<<"), "; log<<*ArrStart<<"), "; ArrStart++;
if((i+1)%4==0) {OF<<"\r\n";} }
}
void main(void) { ofstream log; clrscr(); log.open("log.txt",ios::app); float Array[capacity][2]; float Result[capacity][2];
int count=Input(&Array[0][0], capacity); log<<"count="<<count<<endl; float Max=Square(&Array[0][0], &Result[0][0], count); log<<"max=="<<Max<<endl; Output(&Result[0][0],4*count, Max);
cout<<count<<" Ok. "<<"All done"; getch();
}
|
Есть одна проблема. Например фигура  по моему алгоритму тоже являтся квадратом =( предложите вариант исключения таких случаев?
|