www.pudn.com > polygon_decompose_lx.rar > form.cpp
//--------------------------------------------------------------------------- #include#pragma hdrstop #include #include #include "form.h" #include "Node.h" #include "aboutform.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; const AnsiString DefaultName=AnsiString("Unnamed"); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Count=-1; xEnter=0; yEnter=0; } //--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn1Click(TObject *Sender) { CanSet=true; Edit6->Enabled=true; Edit6->SetFocus(); Edit7->Enabled=true; select=0; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //initiate the points[Count].select if(CanSet==true){ Count++; //add the count of points points[Count].select=0; } } //7.19建立 //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Count>=100){ //beyond the limitation CanSet=false; Image1->Canvas->TextOutA(0,0,"The points have reach the maximum.");} if(CanSet==true){ if(Count>1){ Button1->Enabled=true; connect1->Enabled=true; } points[Count].SetNode(X,Y); NodeImage[Count]=new TImage(Image1); //realize a n object NodeImage[Count]->Picture->LoadFromFile(PathName+"code/2.bmp"); NodeImage[Count]->Left=X+(Image1->Left)-4.5; NodeImage[Count]->Top=Y-4.5+(Image1->Top); NodeImage[Count]->Width=9; NodeImage[Count]->Height=9; NodeImage[Count]->Parent=Form1; NodeImage[Count]->Tag=Count; NodeImage[Count]->OnClick=NodeImageClick; Edit5->Text=IntToStr(Count+1); Image1->Canvas->TextOutA(0,15*(Count+1),IntToStr(Count+1)+" "+ IntToStr(points[Count].XCoordinate)+" "+IntToStr(points[Count].YCoordinate)+" "); } PointFlag=1; int i=0; if(CanSet==false){ // move the point to the assigned position for(i=0;i<=Count;i++){ if(points[i].select==1){ Image1->Canvas->Pen->Color=clWhite; for(int q=0;q<=Count;q++){ for(int i=q;i<=Count;i++){ Image1->Canvas->MoveTo(points[q].XCoordinate,points[q].YCoordinate); Image1->Canvas->LineTo(points[i].XCoordinate,points[i].YCoordinate); } } NodeImage[i]->Left=X+(Image1->Left)-4.5; NodeImage[i]->Top=Y-4.5+(Image1->Top); points[i].XCoordinate=X; points[i].YCoordinate=Y; NodeImage[i]->Picture->LoadFromFile(PathName+"code/2.bmp"); Image1->Canvas->TextOutA(0,15*(i+1),IntToStr(i+1)+" "+ IntToStr(points[i].XCoordinate)+" "+IntToStr(points[i].YCoordinate)+" "); } } for(int i=0;i<=Count;i++){ points[i].select=0; } } CanSet=false; Edit6->Enabled=false; Edit7->Enabled=false; if(HasDraw!=0){ Image1->Canvas->Pen->Color=clAqua; /*for(int i=0;i Width;i++){ for(int j=0;j Height;j++){ Image1->Canvas->Pixels[i][j]=clWhite; } } //if there is something on the canvas clear the canvas*/ if(HasDraw==1){Button1Click(Sender);} if(HasDraw==2){ Button1Click(Sender); if(IsPolygon()){Button2Click(Sender);} } } } //7.19建立 //--------------------------------------------------------------------------- void __fastcall TForm1::NodeImageClick(TObject *Sender){ if(CanSet==false){ NodeImage[((TImage*)Sender)->Tag]->Picture->LoadFromFile(PathName+"code/3.bmp"); for(int i=0;i<=Count;i++){ if(points[i].select==1){ NodeImage[i]->Picture->LoadFromFile(PathName+"code/2.bmp"); } points[i].select=0; } points[((TImage*)Sender)->Tag].select=1;//set this point selected select=1; //suggest there is some point selected } } //7.20建立 //--------------------------------------------------------------------------- //caculate all the length of a polygon double TForm1::PLength(){ double length=0; for(int i=0;i Caption=DefaultName; PathName="D://program/暑期大作业/Lee/"; Form1->Top=120; Form1->Left=180; Image1->Canvas->Pen->Color=clAqua; points=new Node[100]; Edit5->Text="1"; BitBtn1->Enabled=true; Button1->Enabled=false; Button2->Enabled=false; connect1->Enabled=false; Decompose1->Enabled=false; Delete->Enabled=true; CanSet=false; //7.21 CanSet=true; e1->Enabled=true; HasDraw=0; PointFlag=0; Save1->Enabled=true; IntFlag=1; } //7.19建立 //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Image1->Canvas->Pen->Width=2; Image1->Canvas->Pen->Color=clAqua; for(int i=0;i Canvas->MoveTo(points[i].XCoordinate,points[i].YCoordinate); Image1->Canvas->LineTo(points[i+1].XCoordinate,points[i+1].YCoordinate); } Image1->Canvas->MoveTo(points[Count].XCoordinate,points[Count].YCoordinate); Image1->Canvas->LineTo(points[0].XCoordinate,points[0].YCoordinate); Button1->Enabled=false; connect1->Enabled=false; if(!IsPolygon()){ Button2->Enabled=false; Decompose1->Enabled=false; Image1->Canvas->TextOutA(0,0,"sorry,it is not a convex polygon! "); } else{ Image1->Canvas->TextOutA(0,0," "); Button2->Enabled=true; Decompose1->Enabled=true; } BitBtn1->Enabled=false; HasDraw=1; e1->Enabled=false; Delete->Enabled=false; } //7.19建立 //--------------------------------------------------------------------------- //If there IsAnother=0,return boolean TForm1::IsPolygon(){ int isanother=1; double k=0; //the slope double b=0; //the intercept double y1=0; double y2=0; /*7.25前本来是用此算法的 后来验证错误,因此换了个算法。 for(int i=0;i (points[i].XCoordinate)&&(xhighflag==0)){ xhighflag=1; xlowflag=0; ++xhigh; } if((points[i+1].XCoordinate)<(points[i].XCoordinate)&&(xlowflag==0)){ xlowflag=1; xhighflag=0; ++xlow; } if((points[i+1].YCoordinate)>(points[i].YCoordinate)&&(yhighflag==0)){ yhighflag=1; ylowflag=0; ++yhigh; } if((points[i+1].YCoordinate)<(points[i].YCoordinate)&&(ylowflag==0)){ ylowflag=1; yhighflag=0; ++ylow; } } if((points[0].XCoordinate)>(points[Count].XCoordinate)&&(xhighflag==0)){ xhighflag=1; xlowflag=0; ++xhigh; } if((points[0].XCoordinate)<(points[Count].XCoordinate)&&(xlowflag==0)){ xlowflag=1; xhighflag=0; ++xlow; } if((points[0].YCoordinate)>(points[Count].YCoordinate)&&(yhighflag==0)){ yhighflag=1; ylowflag=0; ++yhigh; } if((points[0].YCoordinate)<(points[Count].YCoordinate)&&(ylowflag==0)){ ylowflag=1; yhighflag=0; ++ylow; } if(((xlow+xhigh)>=4)||((ylow+yhigh)>=4)){ return false; } else if(((xlow+xhigh)<4)&&((ylow+yhigh)<4)){ return true; } */ for(int i=1;i 0){ isanother=1;//if point[i+2]and point[i-1]distributed at one side } else isanother=0; } if((points[i].XCoordinate-points[i+1].XCoordinate)==0&&isanother==1){ if((points[i+2].XCoordinate-points[i+1].XCoordinate)*(points[i-1].XCoordinate-points[i].XCoordinate)>0){ isanother=1; } else isanother=0; } } if((points[Count-1].XCoordinate-points[Count].XCoordinate)!=0&&isanother==1){ k=(double)((points[Count].YCoordinate)-(points[Count-1].YCoordinate))/ (double)((points[Count-1].XCoordinate)-(points[Count].XCoordinate)); b=(0-points[Count-1].YCoordinate)-k*points[Count-1].XCoordinate; y1=k*points[0].XCoordinate+b; y2=k*points[Count-2].XCoordinate+b; if((points[0].YCoordinate+y1)*(points[Count-2].YCoordinate+y2)>0){ isanother=1; } else isanother=0; } if((points[Count-1].XCoordinate-points[Count].XCoordinate)==0&&isanother==1){ if((points[0].XCoordinate-points[Count].XCoordinate)*(points[Count-2].XCoordinate-points[Count-1].XCoordinate)>0){ isanother=1; } else isanother=0; } if((points[0].XCoordinate-points[Count].XCoordinate)!=0&&isanother==1){ k=(double)((points[0].YCoordinate)-(points[Count].YCoordinate))/ (double)((points[Count].XCoordinate)-(points[0].XCoordinate)); b=(0-points[Count].YCoordinate)-k*points[Count].XCoordinate; y1=k*points[1].XCoordinate+b; y2=k*points[Count-1].XCoordinate+b; if((points[1].YCoordinate+y1)*(points[Count-1].YCoordinate+y2)>0){ isanother=1; } else isanother=0; } if((points[0].XCoordinate-points[Count].XCoordinate)==0&&isanother==1){ if((points[1].XCoordinate-points[0].XCoordinate)* (points[Count-1].XCoordinate-points[Count].XCoordinate)>0){ //points[Count-1].XCoordinate-points[Count].YCoordinate isanother=1; } else isanother=0; } if(isanother==0){ return false; } else if(isanother==1){ return true; } } //建立于7月25日 //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- double TForm1::distance(int a,int b){ //caculate the distance between two points double templength; double x1=points[a].XCoordinate; double y1=points[a].YCoordinate; double x2=points[b].XCoordinate; double y2=points[b].YCoordinate; templength=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return templength; } //7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 //---------------------------------------------------------------------------- double TForm1::Ttriangle(int a, int b, int c){//caculate all the length of a triangle double length; double length1=distance(a,b); double length2=distance(b,c); double length3=distance(a,c); length=length1+length2+length3; return length; } //7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 //7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 //---------------------------------------------------------------------------- void TForm1::decompose(){ for(int i=1;i<=Count;i++){ t[i][i]=0; } for(int q=2;q<=Count;q++){ for(int i=1;i<=Count-q+1;i++){ int j=i+q-1; t[i][j]=t[i+1][j]+Ttriangle(i-1,i,j); s[i][j]=i; for(int k=i+1;k<=q+i-1;k++){ double r=t[i][k]+t[k+1][j]+Ttriangle(i-1,k,j); if(r Canvas->Pen->Style=psDot; Image1->Canvas->Pen->Color=clNavy; Image1->Canvas->Pen->Width=1; DrawLines(1,Count); Image1->Canvas->Pen->Style=bsSolid; Image1->Canvas->Pen->Color=clAqua; Image1->Canvas->Pen->Width=2; for(int i=0;i Canvas->MoveTo(points[i].XCoordinate,points[i].YCoordinate); Image1->Canvas->LineTo(points[i+1].XCoordinate,points[i+1].YCoordinate); } } /*before 7.22 for(int k=2;k<=Count;k++){ for(i=1;i<=Count-k+1;i++){ j=i+k-1; if(s[i][j]!=0){ Image1->Canvas->MoveTo(points[i-1]->XCoordinate, points[i-1]->YCoordinate); Image1->Canvas->LineTo(points[k]->XCoordinate, points[k]->YCoordinate); Image1->Canvas->MoveTo(points[k]->XCoordinate, points[k]->YCoordinate); Image1->Canvas->LineTo(points[j]->XCoordinate, points[j]->YCoordinate); } } 7.21 具体实现 7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 */ //----------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { float length=0; decompose(); if(Count==2){length=0;} else {length=(float)((t[1][Count]-PLength())/2); } //计算真正的权值 Image1->Canvas->TextOutA(0,0,"Length of all the chords is: "+FloatToStr(length)); Button2->Enabled=false; e1->Enabled=false; for(int i=0;i Canvas->MoveTo(points[i-1].XCoordinate,points[i-1].YCoordinate); Image1->Canvas->LineTo(points[k].XCoordinate,points[k].YCoordinate); Image1->Canvas->MoveTo(points[k].XCoordinate,points[k].YCoordinate); Image1->Canvas->LineTo(points[j].XCoordinate,points[j].YCoordinate); DrawLines(i,k); //using recursion DrawLines(k+1,j); } HasDraw=2; } //------------------------------------------------------------------------------ __fastcall TForm1::~TForm1(){ for(int i=0;i Caption==DefaultName){ result=Application->MessageBoxA("Save the image?","Save",4); } if(result==6){ Save1Click(Sender); } } Form1->Caption="Unnamed"; Image1->Canvas->TextOutA(0,0," "); Image1->Canvas->Pen->Color=clWhite; Image1->Picture->LoadFromFile(PathName+"code/4.bmp"); Image1->Canvas->Refresh(); if(PointFlag==1){ for(int i=0;i<=Count;i++){ delete NodeImage[i]; } delete []points; } Count=-1; FormCreate(Sender); t[1][Count]=0; BitBtn1->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Exit1Click(TObject *Sender) { Form1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::e1Click(TObject *Sender) { if(Count>=0){ delete NodeImage[Count]; Count--; } Edit5->Text=IntToStr(Count+1); Image1->Canvas->TextOutA(0,15*(Count+2)," "); CanSet=false; if(Count<2){Button1->Enabled=false; Button2->Enabled=false;} } //--------------------------------------------------------------------------- void __fastcall TForm1::connect1Click(TObject *Sender) { Button1Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::Decompose1Click(TObject *Sender) { Button2Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Edit3->Text=IntToStr(X); Edit4->Text=IntToStr(Y); } //--------------------------------------------------------------------------- void __fastcall TForm1::Save1Click(TObject *Sender) { if(HasDraw==2){ if(Form1->Caption==DefaultName){ Form1->Caption=InputBox("save","Put in the name",DefaultName); } if(Form1->Caption!=DefaultName){ Image1->Picture->SaveToFile(PathName+"history/"+Form1->Caption+".bmp"); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn2Click(TObject *Sender) { if(xEnter==1&&yEnter==1&&IntFlag==1){ if(TagetX>=0&&TagetX<=Image1->Width &&TagetY>=0&&TagetY<=Image1->Height){ for(int i=0;i<=Count;i++){ if(points[i].select==1){ select=1; NodeImage[i]->Left=TagetX+(Image1->Left)-4.5; NodeImage[i]->Top=TagetY-4.5+(Image1->Top); points[i].XCoordinate=TagetX; points[i].YCoordinate=TagetY; Image1->Canvas->TextOutA(0,15*(i+1),IntToStr(i+1)+" "+ IntToStr(points[i].XCoordinate)+" "+IntToStr(points[i].YCoordinate)); NodeImage[i]->Picture->LoadFromFile(PathName+"/code/2.bmp"); } } if(select!=1){ Count++; points[Count].SetNode(TagetX,TagetY); NodeImage[Count]=new TImage(Image1); //realize a n object NodeImage[Count]->Picture->LoadFromFile(PathName+"/code/2.bmp"); NodeImage[Count]->Left=TagetX+(Image1->Left)-4.5; NodeImage[Count]->Top=TagetY-4.5+(Image1->Top); NodeImage[Count]->Width=9; NodeImage[Count]->Height=9; NodeImage[Count]->Parent=Form1; NodeImage[Count]->Tag=Count; NodeImage[Count]->OnClick=NodeImageClick; Edit5->Text=IntToStr(Count+1); Image1->Canvas->TextOutA(0,15*(Count+1),IntToStr(Count+1)+" "+ IntToStr(points[Count].XCoordinate)+" "+IntToStr(points[Count].YCoordinate)); PointFlag=1; } } } if(Count>1){ Button1->Enabled=true; connect1->Enabled=true; } Edit6->Clear(); Edit7->Clear(); Edit6->Enabled=false; Edit7->Enabled=false; CanSet=false; BitBtn2->Enabled=false; IntFlag=1; BitBtn1->SetFocus(); TagetX=-1; TagetY=-1; select=0; for(int i=0;i<=Count;i++){ points[i].select=0; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit6Change(TObject *Sender) { BitBtn2->Enabled=true; BitBtn2->Enabled=true; xEnter=1; if(Edit6->Text!=""&&IntFlag==1) TagetX=StrToInt(Edit6->Text); } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit7Change(TObject *Sender) { BitBtn2->Enabled=true; yEnter=1; if(Edit7->Text!=""&&IntFlag==1) TagetY=StrToInt(Edit7->Text); } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit6KeyPress(TObject *Sender, char &Key) { BitBtn2->Enabled=true; if(Key!=8&&Key!=46&&Key!=13){ if((Key<=47)||(Key>=58)){ IntFlag=0; } } if(Key==13)Edit7->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit7KeyPress(TObject *Sender, char &Key) { BitBtn2->Enabled=true; if(Key!=8&&Key!=46&&Key!=13){ if((Key<=47)||(Key>=58)){ IntFlag=0; } } if(Key==13) BitBtn2->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn2KeyPress(TObject *Sender, char &Key) { if(Key==13) BitBtn2Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn1KeyPress(TObject *Sender, char &Key) { if(Key==13) BitBtn1Click(Sender); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TForm1::History1Click(TObject *Sender) { if(HasDraw==2){ if(Form1->Caption==DefaultName){ int result=Application->MessageBoxA("Save the image?","Save",4); if(result==1){ Save1Click(Sender); } } } New1Click(Sender); if(Open->Execute()) { Image1->Picture->LoadFromFile(Open->FileName); Form1->Caption=Open->FileName; BitBtn1->Enabled=false; BitBtn2->Enabled=false; Delete->Enabled=false; e1->Enabled=false; connect1->Enabled=false; Decompose1->Enabled=false; } Save1->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::DeleteClick(TObject *Sender) { e1Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TForm1::About1Click(TObject *Sender) { About->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Help2Click(TObject *Sender) { AnsiString ExePath=ExtractFilePath(Application->ExeName); ShellExecute(NULL,"open",(ExePath+"PDSHELP.chm").c_str(), NULL, NULL, SW_SHOWNORMAL); } //---------------------------------------------------------------------------