📄 form.~cpp
字号:
//---------------------------------------------------------------------------
#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 + -