⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form.~cpp

📁 用户指定顶点
💻 ~CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <Math.h>
#include <dos.h>

#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<Image1->Width;i++){
                        for(int j=0;j<Image1->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<Count;i++){
                 length=length+distance(i,i+1);
         }
         length=length+distance(Count,0);
         return length;
}

//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Form1->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<Count;i++){ //connect every two neighbor points except the last two
                Image1->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<Count;i++){
                if((points[i+1].XCoordinate)>(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<Count-1;i++){
                if((points[i].XCoordinate-points[i+1].XCoordinate)!=0&&isanother==1){
                        k=(double)((points[i+1].YCoordinate)-(points[i].YCoordinate))/
                        (double)((points[i].XCoordinate)-(points[i+1].XCoordinate));
                        b=(0-points[i].YCoordinate)-k*points[i].XCoordinate;
                        y1=k*points[i+2].XCoordinate+b;      //x1=points[i+2] 代入方程
                        y2=k*points[i-1].XCoordinate+b;      //x2=points[i-1] 代入方程
                        if((points[i+2].YCoordinate+y1)*(points[i-1].YCoordinate+y2)>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(){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -