?? vector.~cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Vector.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
//構造函數
TGisVectorLayer::TGisVectorLayer()
{
m_lpPolygonList=NULL;
m_nSelectID = -1;
}
//---------------------------------------------------------------------------
//析構函數
TGisVectorLayer::~TGisVectorLayer()
{
if(m_lpPolygonList)
{
//釋放資源
for(int i=0;i<m_lpPolygonList->Count;i++)
{
delete m_lpPolygonList->Items[i];
}
delete m_lpPolygonList;
}
}
//---------------------------------------------------------------------------
//讀入Idris格式的矢量文件
BOOL TGisVectorLayer::OpenIdrisFile(AnsiString FileName)
{
//首先讀入文件頭
AnsiString DocFileName= ChangeFileExt(FileName,".dvc");
TStringList *StringList1=new TStringList();
StringList1->LoadFromFile(DocFileName);
AnsiString type=StringList1->Strings[3].SubString(15,StringList1->Strings[4].Length()-13);
if(type=="polygon")
m_gisFileHeader.giType=GIS_POLYGON;
else if(type=="point")
m_gisFileHeader.giType=GIS_POINT;
else
m_gisFileHeader.giType=GIS_LINE;
m_gisFileHeader.giMinX = StringList1->Strings[7].SubString(15,StringList1->Strings[7].Length()-13).ToDouble();
m_gisFileHeader.giMaxX = StringList1->Strings[8].SubString(15,StringList1->Strings[8].Length()-13).ToDouble();
m_gisFileHeader.giMinY = StringList1->Strings[9].SubString(15,StringList1->Strings[9].Length()-13).ToDouble();
m_gisFileHeader.giMaxY = StringList1->Strings[10].SubString(15,StringList1->Strings[10].Length()-13).ToDouble();
delete StringList1;
TFileStream* File=new TFileStream(FileName,fmOpenRead);
if(m_gisFileHeader.giType==GIS_POLYGON
|| m_gisFileHeader.giType==GIS_LINE)
{
m_lpPolygonList=new TList;
float test[2];
File->Read(test,8);
do
{
LPGISPOLYGON polygon = new GISPOLYGON;
polygon->point = new GISPOINT[test[1]];
polygon->pPen = new TPen;
polygon->pBrush = new TBrush;
polygon->id=test[0];
polygon->numberPoint=test[1];
File->Read((float*)polygon->point ,4*2*test[1]);
//計算多邊形的外包圍矩形
polygon->outRect.x1=polygon->point[0].x;
polygon->outRect.x2=polygon->point[0].x;
polygon->outRect.y1=polygon->point[0].y;
polygon->outRect.y2=polygon->point[0].y;
for(int i=1;i<test[1];i++)
{
if(polygon->outRect.x1>polygon->point[i].x)
polygon->outRect.x1=polygon->point[i].x;
if(polygon->outRect.x2<polygon->point[i].x)
polygon->outRect.x2=polygon->point[i].x;
if(polygon->outRect.y1>polygon->point[i].y)
polygon->outRect.y1=polygon->point[i].y;
if(polygon->outRect.y2<polygon->point[i].y)
polygon->outRect.y2=polygon->point[i].y;
}
m_lpPolygonList->Add (polygon);
File->Read(test,8);
}while(test[0]!=0 && test[1]!=0);
}
delete File;
return TRUE;
}
//---------------------------------------------------------------------------
//繪制函數
void TGisVectorLayer::Draw(TCanvas* canvas,GISRECT SourceRect,TRect DestRect)
{
m_DrawRect=DestRect;
m_gisSourceRect=SourceRect;
m_canvas=canvas;
m_ratioX=DestRect.Width() /(SourceRect.x2-SourceRect.x1);
m_ratioY=DestRect.Height()/(SourceRect.y2-SourceRect.y1);
canvas->Brush->Color=clBlack;
if(m_gisFileHeader.giType==GIS_POLYGON
|| m_gisFileHeader.giType==GIS_LINE)
{
for(int i=0;i<m_lpPolygonList->Count;i++)
{
LPGISPOLYGON polygon=(GISPOLYGON*)m_lpPolygonList->Items[i];
DrawAPolygon(polygon,SourceRect,DestRect);
if(i == m_nSelectID)
{
DrawSelectPolygon(SourceRect,DestRect);
}
}
}
}
//---------------------------------------------------------------------------
//繪制一個多邊形
void TGisVectorLayer::DrawAPolygon(LPGISPOLYGON polygon,GISRECT SourceRect,TRect DestRect)
{
int pointCount=polygon->numberPoint ;
TPoint* points = new TPoint[pointCount];
for(int i=0; i<pointCount; i++)
{
points[i].x = m_ratioX*(polygon->point[i].x-SourceRect.x1);
points[i].y = DestRect.Height()-m_ratioY*(polygon->point[i].y-SourceRect.y1);
}
m_canvas->Pen->Style = polygon->pPen->Style;
m_canvas->Pen->Width = polygon->pPen->Width;
m_canvas->Pen->Color = polygon->pPen->Color;
m_canvas->Brush->Style = polygon->pBrush->Style;
m_canvas->Brush->Color = polygon->pBrush->Color;
if(polygon->pBrush->Bitmap)
{
m_canvas->Brush->Bitmap = polygon->pBrush->Bitmap;
}
m_canvas->Polygon(points, pointCount-1);
// m_canvas->Polyline(points, pointCount-1);
delete points;
}
//---------------------------------------------------------------------------
//用于判斷一個點是否在一個多邊形中
//返回TRUE:表示點在多邊形中,否則點不在多邊形中
BOOL TGisVectorLayer::PointIsInPolygon(LPGISPOLYGON polygon,GISPOINT point)
{
//如果點在多邊形的外包圍矩形外,那么肯定沒有交點
if( point.x < polygon->outRect.x1
|| point.x > polygon->outRect.x2
|| point.y < polygon->outRect.y1
|| point.y > polygon->outRect.y2)
return FALSE;
int count=0;
for(int i=0;i<polygon->numberPoint-1;i++)
{
GISLINE tempLine(polygon->point[i].x,
polygon->point[i].y,
polygon->point[i+1].x,
polygon->point[i+1].y);
if(point.y < tempLine.Y1 && point.y < tempLine.Y2)
continue;
float a;
float b;
if(tempLine.X2==tempLine.X1)
continue;
a=(tempLine.Y2-tempLine.Y1)/(tempLine.X2-tempLine.X1);
b=tempLine.Y1-a*tempLine.X1;
float y=a*point.x+b;
if(y<point.y
&& y<=(tempLine.Y1>tempLine.Y2 ? tempLine.Y1 : tempLine.Y2)
&& y>=(tempLine.Y1<tempLine.Y2? tempLine.Y1 : tempLine.Y2)
&& point.x<=(tempLine.X1>tempLine.X2 ? tempLine.X1 : tempLine.X2)
&& point.x>=(tempLine.X1<tempLine.X2 ? tempLine.X1 : tempLine.X2))
count++;
}
if(count%2)
return TRUE;
else
return FALSE;
}
//---------------------------------------------------------------------------
//將行列值的坐標變換成X、Y值坐標
GISPOINT TGisVectorLayer::TPointToGisPoint(TPoint SourcePoint)
{
GISPOINT point;
point.x= SourcePoint.x/m_ratioX + m_gisFileHeader.giMinX;
point.y= (m_DrawRect.Height()-SourcePoint.y)/m_ratioY + m_gisFileHeader.giMinY;
return point;
}
//---------------------------------------------------------------------------
//選擇多邊形函數
void TGisVectorLayer::SelectPolygon(TPoint SourcePoint)
{
for(int i=0;i<m_lpPolygonList->Count;i++)
{
GISPOINT point=TPointToGisPoint(SourcePoint);
if(PointIsInPolygon((GISPOLYGON*)(m_lpPolygonList->Items[i]),point))
{
m_nSelectID = i;
return;
}
}
m_nSelectID = -1;
}
//---------------------------------------------------------------------------
void TGisVectorLayer::DrawSelPlyWithBitmap(GISRECT SourceRect,TRect DestRect)
{/*
Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
try
{
LPGISPOLYGON polygon = (GISPOLYGON*)m_lpPolygonList->Items[m_nSelectID];
int pointCount=polygon->numberPoint ;
BrushBmp->LoadFromFile(m_strBitmapFileName);
m_canvas->Brush->Bitmap = BrushBmp;
TPoint* points = new TPoint[pointCount];
for(int i=0; i<pointCount; i++)
{
points[i].x=ratioX*(polygon->point[i].x-SourceRect.x1);
points[i].y=DestRect.Height()-ratioY*(polygon->point[i].y-SourceRect.y1);
}
m_canvas->Polygon(points, pointCount-1);
delete points;
m_canvas->Brush->Bitmap = NULL;
}
__finally
{
m_canvas->Brush->Bitmap = NULL;
delete BrushBmp;
} */
}
//---------------------------------------------------------------------------
void TGisVectorLayer::DrawSelectPolygon(GISRECT SourceRect,TRect DestRect)
{
TColor oldColor = m_canvas->Brush->Color; //保存原畫刷顏色
LPGISPOLYGON polygon = (GISPOLYGON*)m_lpPolygonList->Items[m_nSelectID];
//在本次所選擇的多邊形中填充紅色
m_canvas->Brush->Color=clRed;
int pointCount=polygon->numberPoint ;
TPoint* points = new TPoint[pointCount];
for(int i=0; i<pointCount; i++)
{
points[i].x=m_ratioX*(polygon->point[i].x-SourceRect.x1);
points[i].y=DestRect.Height()-m_ratioY*(polygon->point[i].y-SourceRect.y1);
}
m_canvas->Pen->Style = polygon->pPen->Style;
m_canvas->Pen->Width = polygon->pPen->Width;
m_canvas->Pen->Color = polygon->pPen->Color;
m_canvas->Polygon(points, pointCount-1);
delete points;
m_canvas->Brush->Color=oldColor; //恢復使用原畫刷顏色
}
//---------------------------------------------------------------------------
void TGisVectorLayer::SetBitmapBrush(AnsiString strBitmapFile)
{
LPGISPOLYGON polygon = (GISPOLYGON*)m_lpPolygonList->Items[m_nSelectID];
Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
BrushBmp->LoadFromFile(strBitmapFile);
polygon->pBrush->Bitmap = BrushBmp;
}
//---------------------------------------------------------------------------
//將圖形坐標的點轉換成屏幕坐標
TPoint TGisVectorLayer:: GisPointToTPoint(GISPOINT SourcePoint)
{
TPoint point;
point.x = (SourcePoint.x - m_gisFileHeader.giMinX)*m_ratioX;
point.y = m_DrawRect.Height() - (SourcePoint.y - m_gisFileHeader.giMinY)*m_ratioY;
return point;
}
//---------------------------------------------------------------------------
//將圖形坐標中的矩形轉變為屏幕坐標
TRect TGisVectorLayer::GisRectToTRect(GISRECT SourceRect)
{
GISPOINT pt1, pt2;
pt1.x = SourceRect.x1;
pt1.y = SourceRect.y1;
pt2.x = SourceRect.x2;
pt2.y = SourceRect.y2;
TPoint point1, point2;
point1 = GisPointToTPoint(pt1);
point2 = GisPointToTPoint(pt2);
return TRect(point1,point2);
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -