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 

解决方案 »

  1.   

    // ÓÉTINÉú³ÉµÈÖµÏß¡£ 2003.9.26. 2004.5.8. ¸Ä¡£
    //²ÎÊý£º
    //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;
    }// &acute;&Oacute;&Egrave;&yacute;&frac12;&Ccedil;&Iacute;&oslash;±&szlig;&frac12;&ccedil;&Eacute;&Iuml;&iquest;&ordf;&Ecirc;&frac14;&Euml;&Ntilde;&Euml;÷&micro;&Egrave;&Ouml;&micro;&Iuml;&szlig;&iexcl;&pound;
    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. &cedil;&Auml;&iexcl;&pound;
    TrackContourByTIN(pTINObj, dHeight, lTriNo, lVertexNo, pContourMark, pContourArray->ContourArray);
    ContourList.AddTail(pContourArray);
    }// &acute;&Oacute;&Egrave;&yacute;&frac12;&Ccedil;&Iacute;&oslash;&Auml;&Uacute;&sup2;&iquest;&Euml;&Ntilde;&Euml;÷&micro;&Egrave;&Ouml;&micro;&Iuml;&szlig;&iexcl;&pound;
    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. &cedil;&Auml;&iexcl;&pound;
    TrackContourByTIN(pTINObj, dHeight, i, lVertexNo, pContourMark, pContourArray->ContourArray);
    ContourList.AddTail(pContourArray);
    // break;
    }
    if(pContourMark!=NULL)
    {
    delete pContourMark;
    pContourMark = NULL;
    }
    }
      

  2.   

    “这里约定:角平分线方向指向折线走向的左侧(面向线段前进方向看的情况),并是从x轴正向起算按反时针方向计的角度。角平分线方向B 可由与之相邻的两直线段的方向来计算确定。”计算折线AB、BC的角平分线方向,可以分别计算线段AB、BC与X轴方向夹角,设为A1、A2
    这样折线AB、BC的角平分线与X轴夹角为(A1 - A2)/ 2 + 45度