📄 pmainform.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "pMainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
InitArray();
//从资源文件中装载光标
HINSTANCE HInst;
HInst = reinterpret_cast<HINSTANCE>(HInstance);
Screen->Cursors[crPan] = LoadCursor(HInst, "PAN");
Screen->Cursors[crZoomOut] = LoadCursor(HInst, "ZOOMOUT");
Screen->Cursors[crZoomIn] = LoadCursor(HInst, "ZOOMIN");
Screen->Cursors[crZoomWin] = LoadCursor(HInst, "ZOOMWIN");
Screen->Cursors[crZoomBack] = LoadCursor(HInst, "ZOOMBACK");
OpenStatus=false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N3Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N2Click(TObject *Sender)
{
if(OpenDialog->Execute())
{
FileName=OpenDialog->FileName;
ReadPointSet(FileName.c_str());
SetPointSetBox();
OpenStatus=true;
ZoomFull();
RefreshMap();
}
}
void TMainForm::DrawTin(int No)
{
DrawLine(tins->Tins[No].P1,tins->Tins[No].P2);
DrawLine(tins->Tins[No].P1,tins->Tins[No].P3);
DrawLine(tins->Tins[No].P2,tins->Tins[No].P3);
}
void TMainForm::DrawTinset()
{for(int i=0;i<tins->tNum;i++)DrawTin(i);}
void __fastcall TMainForm::TIN1Click(TObject *Sender)
{
//Create Tin
SetInitialTin();
TinGrow(0);
}
//---------------------------------------------------------------------------
void TMainForm::SetInitialTin()
{
int P1=0,P2,P3;
SearchNearestPoint(P1,&P2);
SearchNewPoint(P1,P2,&P3,1);
if(P3<0)SearchNewPoint(P1,P2,&P3,-1);
tins->Tins[tins->tNum].P1=P1;
tins->Tins[tins->tNum].P2=P2;
tins->Tins[tins->tNum].P3=P3;
tins->tNum=1;
DrawTin(0);
}
void TMainForm::AddTin(int P1,int P2,int P3)
{
tins->Tins[tins->tNum].P1=P1;
tins->Tins[tins->tNum].P2=P2;
tins->Tins[tins->tNum].P3=P3;
tins->tNum++;
DrawTin(tins->tNum-1);
}
void TMainForm::TinGrow(int tNo)
{
int P1=tins->Tins[tNo].P1,
P2=tins->Tins[tNo].P2,
P3=tins->Tins[tNo].P3;
int PA1,PA2,PB1,PB2,PC1,PC2;
SearchNewPoint(P1,P2,&PA1,1);
SearchNewPoint(P2,P3,&PB1,1);
SearchNewPoint(P3,P1,&PC1,1);
SearchNewPoint(P1,P2,&PA2,-1);
SearchNewPoint(P2,P3,&PB2,-1);
SearchNewPoint(P3,P1,&PC2,-1);
if(PA1!=P3&&isNewTin(P1,P2,PA1)){AddTin(P1,P2,PA1);TinGrow(tins->tNum-1);}
if(PB1!=P1&&isNewTin(P2,P3,PB1)){AddTin(P2,P3,PB1);TinGrow(tins->tNum-1);}
if(PC1!=P2&&isNewTin(P3,P1,PC1)){AddTin(P3,P1,PC1);TinGrow(tins->tNum-1);}
if(PA2!=P3&&isNewTin(P1,P2,PA2)){AddTin(P1,P2,PA2);TinGrow(tins->tNum-1);}
if(PB2!=P1&&isNewTin(P2,P3,PB2)){AddTin(P2,P3,PB2);TinGrow(tins->tNum-1);}
if(PC2!=P2&&isNewTin(P3,P1,PC2)){AddTin(P3,P1,PC2);TinGrow(tins->tNum-1);}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::sButton1Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::sButton4Click(TObject *Sender)
{
ZoomFull();
RefreshMap();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::sButton5Click(TObject *Sender)
{
OperateID=ZOOMIN;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::sButton6Click(TObject *Sender)
{
OperateID=ZOOMOUT;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::sButton7Click(TObject *Sender)
{
OperateID=PAN;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::sButton8Click(TObject *Sender)
{
OperateID=ZOOMBOX;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{ //在显示区内按下鼠标时,需执行相应操作
if(!(Y>ToolBar->Height&&Y<ClientHeight-sBar->Height))return; //在地图外的操作无效
ptMouse.x=X;
ptMouse.y=Y;
ptMouseTmp.x=X;
ptMouseTmp.y=Y;
PNT mpt; //屏幕点<X,Y>对应于地图的坐标
mpt.x=X; mpt.y=Y;
GetMapPoint(&mpt);
switch(OperateID)
{
case ZOOMIN: //放大
{
xcenter=mpt.x;
ycenter=mpt.y;
zoomratio/=ZoomFactor;
RefreshMap();
break;
}
case ZOOMOUT: //缩小
{
xcenter=mpt.x;
ycenter=mpt.y;
zoomratio*=ZoomFactor;
RefreshMap();
break;
}
case PAN: //平移
break;
case ZOOMBOX:
{
Captured=true;
break;
}
default: break;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{ //鼠标移动时,显示坐标
AnsiString S="屏幕坐标("+IntToStr(X)+","+IntToStr(Y)+")";
PNT mpt;
mpt.x=X; mpt.y=Y;
GetMapPoint(&mpt);
S+=" ";
S+="地图坐标("+FloatToStr(mpt.x)+","+FloatToStr(mpt.y)+")";
switch(OperateID)
{
case ZOOMIN: {Cursor=TCursor(crZoomOut); break;}
case ZOOMOUT: {Cursor=TCursor(crZoomIn);break;}
case PAN: {Cursor=TCursor(crPan); break;}
case ZOOMBOX: {Cursor=TCursor(crZoomWin);break;}
default: {Cursor=TCursor(crDefault); break;}
}
//当开窗时,要动态显示BOX
if(OperateID==ZOOMBOX&&Captured)
{
PNT pt1,pt2,pt12;
pt1.x=ptMouse.x; pt1.y=ptMouse.y;
pt2.x=X; pt2.y=Y;
pt12.x=ptMouseTmp.x; pt12.y=ptMouseTmp.y;
ZoomBox_minx=(pt1.x>pt12.x)?pt12.x:pt1.x;
ZoomBox_miny=(pt1.y>pt12.y)?pt12.y:pt1.y;
ZoomBox_maxx=(pt1.x<pt12.x)?pt12.x:pt1.x;
ZoomBox_maxy=(pt1.y<pt12.y)?pt12.y:pt1.y;
for(int i=ZoomBox_minx;i<=ZoomBox_maxx;i++)
{
Canvas->Pixels[i][ZoomBox_miny]=ZoomBoxColor[0][i];
Canvas->Pixels[i][ZoomBox_maxy]=ZoomBoxColor[2][i];
}
for(int j=ZoomBox_miny;j<=ZoomBox_maxy;j++)
{
Canvas->Pixels[ZoomBox_minx][j]=ZoomBoxColor[1][j];
Canvas->Pixels[ZoomBox_maxx][j]=ZoomBoxColor[3][j];
}
ZoomBox_minx=(pt1.x>pt2.x)?pt2.x:pt1.x;
ZoomBox_miny=(pt1.y>pt2.y)?pt2.y:pt1.y;
ZoomBox_maxx=(pt1.x<pt2.x)?pt2.x:pt1.x;
ZoomBox_maxy=(pt1.y<pt2.y)?pt2.y:pt1.y;
for(int i=ZoomBox_minx;i<=ZoomBox_maxx;i++)
{
ZoomBoxColor[0][i]=Canvas->Pixels[i][ZoomBox_miny];
ZoomBoxColor[2][i]=Canvas->Pixels[i][ZoomBox_maxy];
}
for(int j=ZoomBox_miny;j<=ZoomBox_maxy;j++)
{
ZoomBoxColor[1][j]=Canvas->Pixels[ZoomBox_minx][j];
ZoomBoxColor[3][j]=Canvas->Pixels[ZoomBox_maxx][j];
}
Canvas->MoveTo(ZoomBox_minx,ZoomBox_miny);
Canvas->LineTo(ZoomBox_minx,ZoomBox_maxy);
Canvas->LineTo(ZoomBox_maxx,ZoomBox_maxy);
Canvas->LineTo(ZoomBox_maxx,ZoomBox_miny);
Canvas->LineTo(ZoomBox_minx,ZoomBox_miny);
ptMouseTmp.x=pt2.x;
ptMouseTmp.y=pt2.y;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
PNT mpt1,mpt2;
mpt1.x=ptMouse.x; mpt1.y=ptMouse.y;
mpt2.x=X; mpt2.y=Y;
int DX=mpt2.x-mpt1.x;
int DY=mpt2.y-mpt1.y;
GetMapPoint(&mpt1);
GetMapPoint(&mpt2);
switch(OperateID)
{
case ZOOMBOX:
{
Captured=false;
if(labs(DX)>=2&&labs(DY)>=2)
{
double xmin,ymin,xmax,ymax,dx,dy;
if(mpt1.x>mpt2.x)
{xmin=mpt2.x; xmax=mpt1.x;}
else{xmin=mpt1.x; xmax=mpt2.x;}
if(mpt1.y>mpt2.y)
{ymin=mpt2.y; ymax=mpt1.y;}
else{ymin=mpt1.y; ymax=mpt2.y;}
xcenter=xmin+(xmax-xmin)/2.;
ycenter=ymin+(ymax-ymin)/2.;
dx=xmax-xmin;
dy=ymax-ymin;
double fx,fy;
fx=dx/ClientWidth;
fy=dy/(ClientHeight-ToolBar->Height-sBar->Height);
if(fx>fy)zoomratio=fx;
else zoomratio=fy;
RefreshMap();
}
else
{
xcenter=mpt2.x;
ycenter=mpt2.y;
zoomratio/=ZoomFactor;
RefreshMap();
break;
}
break;
}
case PAN:
{
xcenter-=mpt2.x-mpt1.x;
ycenter-=mpt2.y-mpt1.y;
RefreshMap();
break;
}
default: break;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormResize(TObject *Sender)
{
if(OpenStatus)RefreshMap();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormPaint(TObject *Sender)
{
if(OpenStatus)RefreshMap();
}
//---------------------------------------------------------------------------
void TMainForm::GetScreenPoint(PNT * pt)
{ //将地图坐标转换为屏幕坐标
pt->x=(pt->x-xcenter)/zoomratio+ClientWidth/2;
pt->y=(pt->y-ycenter)/zoomratio+(ClientHeight-ToolBar->Height-sBar->Height)/2;
pt->y=ClientHeight-(pt->y+sBar->Height);
}
//---------------------------------------------------------------------------
void TMainForm::GetMapPoint(PNT * pt)
{ //将屏幕坐标转换为地图坐标
pt->x=zoomratio*(pt->x-ClientWidth/2)+xcenter;
pt->y=zoomratio*(ClientHeight-pt->y-sBar->Height-(ClientHeight-ToolBar->Height-sBar->Height)/2)+ycenter;
}
//---------------------------------------------------------------------------
void TMainForm::ZoomFull()
{ //全幅显示时,改变有关参数
double zx,zy;
xcenter=pts->xmin+pts->dx/2.;
ycenter=pts->ymin+pts->dy/2.;
zx=pts->dx/ClientWidth;
zy=pts->dy/(ClientHeight-ToolBar->Height-sBar->Height);
if(zx>zy)zoomratio=zx;
else zoomratio=zy;
zoomratio0=zoomratio;
}
//---------------------------------------------------------------------------
void TMainForm::RefreshMap()
{ //刷新地图
Canvas->FillRect(Rect(0,0,ClientWidth,ClientHeight));
DrawPointSet();
DrawTinset();
}
//---------------------------------------------------------------------------
void TMainForm::DrawPointSet()
{
Canvas->Pen->Color=clRed;
PNT P;
for(int i=0;i<pts->pNum;i++)
{
//Canvas->Ellipse(GetScreenX(pts->x[i])-2,GetScreenY(pts->y[i])-2,GetScreenX(pts->x[i])+2,GetScreenY(pts->y[i])+2);
P.x=pts->x[i];
P.y=pts->y[i];
GetScreenPoint(&P);
Canvas->Ellipse(P.x-3.,P.y-3.,P.x+3,P.y+3);
}
}
void TMainForm::DrawLine(int P1,int P2)
{
Canvas->Pen->Color=clBlue;
PNT PA,PB;
PA.x=pts->x[P1]; PA.y=pts->y[P1];
PB.x=pts->x[P2]; PB.y=pts->y[P2];
GetScreenPoint(&PA);
GetScreenPoint(&PB);
Canvas->MoveTo(PA.x,PA.y);
Canvas->LineTo(PB.x,PB.y);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -