1、概述
简言之,等距线是指与已知线条(折线或曲线)等距的线条。等距线的应用甚广,例如:在地图上用于表示由平行线组成的各种线状符号(如道路,管线等);在多边形内可由一系列闭合的等距线(称等距圈或同心线,例如在CorelDraw中执行Effects->Contour选项所产生的图形)来表示某种区域特征;在GIS“缓冲带”分析时,“缓冲带”的轮廓就是以某一线状要素为中轴在其两侧构造等距线,并使两端闭合的图形。又如,沿海国家可按等距线方法计算确定专属经济区海域的界线。
2、折线的等距线原始线为折线的等距线,其计算和绘制过程(“推平行线”)如下。(1)计算折线节点(各直线段的转折点)处的角平分线方向B //拜求该步骤的算发 折线是由各直线段组成的,与各直线段等距的同侧平行线邻接于折线节点处的角平分线上。这里约定:角平分线方向指向折线走向的左侧(面向线段前进方向看的情况),并是从x轴正向起算按反时针方向计的角度。角平分线方向B 可由与之相邻的两直线段的方向来计算确定。(2)计算等距线的节点坐标
这里,等距线节点是指等距线上相邻直线段的交接点,它位于角平分线上,与原始线节点(x,y)对应的等距线节点的坐标(x0,y0)为:
x0=x±d'×cosB
y0=y±d'×sinB
式中d’代表等距线在角平分线上的截距,可由d和相邻的两直线段方向算得,一般情况下d’> d。如果在折线左侧作等距线,式中d’前的符号应取正号,反之取负号。
对于不闭合的折线,在首、末点处,以垂直于该处直线段的方向作为角平分线方向。等距线在首、末点处的端点坐标亦按上式计算。
(3)从等距线始点起顺序连接等距线各节点直至终点(也可一边计算一边连接)拜求(1)计算折线节点(各直线段的转折点)处的角平分线方向B
简言之,等距线是指与已知线条(折线或曲线)等距的线条。等距线的应用甚广,例如:在地图上用于表示由平行线组成的各种线状符号(如道路,管线等);在多边形内可由一系列闭合的等距线(称等距圈或同心线,例如在CorelDraw中执行Effects->Contour选项所产生的图形)来表示某种区域特征;在GIS“缓冲带”分析时,“缓冲带”的轮廓就是以某一线状要素为中轴在其两侧构造等距线,并使两端闭合的图形。又如,沿海国家可按等距线方法计算确定专属经济区海域的界线。
2、折线的等距线原始线为折线的等距线,其计算和绘制过程(“推平行线”)如下。(1)计算折线节点(各直线段的转折点)处的角平分线方向B //拜求该步骤的算发 折线是由各直线段组成的,与各直线段等距的同侧平行线邻接于折线节点处的角平分线上。这里约定:角平分线方向指向折线走向的左侧(面向线段前进方向看的情况),并是从x轴正向起算按反时针方向计的角度。角平分线方向B 可由与之相邻的两直线段的方向来计算确定。(2)计算等距线的节点坐标
这里,等距线节点是指等距线上相邻直线段的交接点,它位于角平分线上,与原始线节点(x,y)对应的等距线节点的坐标(x0,y0)为:
x0=x±d'×cosB
y0=y±d'×sinB
式中d’代表等距线在角平分线上的截距,可由d和相邻的两直线段方向算得,一般情况下d’> d。如果在折线左侧作等距线,式中d’前的符号应取正号,反之取负号。
对于不闭合的折线,在首、末点处,以垂直于该处直线段的方向作为角平分线方向。等距线在首、末点处的端点坐标亦按上式计算。
(3)从等距线始点起顺序连接等距线各节点直至终点(也可一边计算一边连接)拜求(1)计算折线节点(各直线段的转折点)处的角平分线方向B
//²ÎÊý£º
//pTINObj-->TINµÄÖ¸Õ룻
//dHeight-->Ҫ׷×ٵĵÈÖµÏߵĸ̣߳»
//ContourList-->·µ»ØµÄµÈÖµÏßÁбíÊý×é¡£
void ProduceContourByTIN(CTINObj* pTINObj, double dHeight, CContourList& ContourList)
{
long i, j, lNumPoint, lNumTri, lNumLine;
long lTriNo, lVertexNo;
double zmin, zmax, zmin1, zmax1;
bool *pContourMark = NULL;
CPoint3D pt1, pt2, pt3;
TRIVERTEXINFO TriVertexInfo;
CTriVertexInfo TriVertexInfoArray;
// CPoint3DArray ContourArray;
CONTOURARRAY* pContourArray; lNumPoint = pTINObj->lPointNum;
lNumTri = pTINObj->lTriNum;// ½¨Á¢Èý½ÇÍøÊÇ·ñÓÐÏß±êÖ¾¡£
pContourMark = new bool[lNumTri];
for(i=0;i<lNumTri;i++)
{
if(pTINObj->ppTriangle[i][6]<0)
{
pContourMark[i] = false;
continue;
}
j = pTINObj->ppTriangle[i][0];
pt1 = pTINObj->pTinP3D[j].P3D;
j = pTINObj->ppTriangle[i][1];
pt2 = pTINObj->pTinP3D[j].P3D;
j = pTINObj->ppTriangle[i][2];
pt3 = pTINObj->pTinP3D[j].P3D;
zmin = FindMin(pt1.z, pt2.z, pt3.z);
zmax = FindMax(pt1.z, pt2.z, pt3.z);
if(zmax>dHeight&&zmin<=dHeight)
{
pContourMark[i] = true;
j = pTINObj->ppTriangle[i][3];
zmin1 = __min(pt1.z, pt2.z);
zmax1 = __max(pt1.z, pt2.z);
if(zmax1>dHeight&&zmin1<=dHeight&&j<0)
{
TriVertexInfo.lTriNo = i;
TriVertexInfo.lVertexNo = 0;
TriVertexInfoArray.Add(TriVertexInfo);
continue;
}
j = pTINObj->ppTriangle[i][4];
zmin1 = __min(pt2.z, pt3.z);
zmax1 = __max(pt2.z, pt3.z);
if(zmax1>dHeight&&zmin1<=dHeight&&j<0)
{
TriVertexInfo.lTriNo = i;
TriVertexInfo.lVertexNo = 1;
TriVertexInfoArray.Add(TriVertexInfo);
continue;
}
j = pTINObj->ppTriangle[i][5];
zmin1 = __min(pt3.z, pt1.z);
zmax1 = __max(pt3.z, pt1.z);
if(zmax1>dHeight&&zmin1<=dHeight&&j<0)
{
TriVertexInfo.lTriNo = i;
TriVertexInfo.lVertexNo = 2;
TriVertexInfoArray.Add(TriVertexInfo);
continue;
}
}
else
pContourMark[i] = false;
}// ´ÓÈý½ÇÍø±ß½çÉÏ¿ªÊ¼ËÑË÷µÈÖµÏß¡£
lNumLine = TriVertexInfoArray.GetSize();
for(i=0;i<lNumLine;i++)
{
/// if(i>0)return;
TriVertexInfo = TriVertexInfoArray.GetAt(i);
lTriNo = TriVertexInfo.lTriNo;
lVertexNo = TriVertexInfo.lVertexNo;
if(!pContourMark[lTriNo])continue;
pContourArray = new CONTOURARRAY;
pContourArray->dHeight = dHeight; //2004.4.8. ¸Ä¡£
TrackContourByTIN(pTINObj, dHeight, lTriNo, lVertexNo, pContourMark, pContourArray->ContourArray);
ContourList.AddTail(pContourArray);
}// ´ÓÈý½ÇÍøÄÚ²¿ËÑË÷µÈÖµÏß¡£
for(i=0;i<lNumTri;i++)
{
if(!pContourMark[i])continue;
j = pTINObj->ppTriangle[i][0];
pt1 = pTINObj->pTinP3D[j].P3D;
j = pTINObj->ppTriangle[i][1];
pt2 = pTINObj->pTinP3D[j].P3D;
j = pTINObj->ppTriangle[i][2];
pt3 = pTINObj->pTinP3D[j].P3D;
if(pt1.z>dHeight&&pt2.z<=dHeight||pt1.z<=dHeight&&pt2.z>dHeight)
lVertexNo = 0;
else if(pt2.z>dHeight&&pt3.z<=dHeight||pt2.z<=dHeight&&pt3.z>dHeight)
lVertexNo = 1;
else
lVertexNo = 2;
pContourArray = new CONTOURARRAY;
pContourArray->dHeight = dHeight; //2004.4.8. ¸Ä¡£
TrackContourByTIN(pTINObj, dHeight, i, lVertexNo, pContourMark, pContourArray->ContourArray);
ContourList.AddTail(pContourArray);
// break;
}
if(pContourMark!=NULL)
{
delete pContourMark;
pContourMark = NULL;
}
}
这样折线AB、BC的角平分线与X轴夹角为(A1 - A2)/ 2 + 45度