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

📄 pmainform.cpp

📁 tin生成源代码
💻 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 + -