VC++开发GIS系统(162)重绘线之查找可视范围所有的线

继续前文重绘线工作,在重绘窗口的时候,判断可视范围下的所有图形可以在一定程度上提高程序的运行速度。 在文章《VC++开发GIS系统(92)窗口的重绘(二)》中讲解了获取可视范围下所有点的函数,本文实现一个获取可视范围下所有线的函数。

#### 函数定义

在_malaIO.h的CLineIO中添加下面的函数

void getAllLines(malaScreen &pScreen, vector<malaLineFile>&pAllLines, CString &fileName);//获取某个文件中某一范围的所有的线

参数:

  1. pScreen 当前的屏幕
  2. pAllPoints 返回的所有可视的线
  3. fileName 线文件的完整路径

函数实现

在_malaIO.cpp中实现上述函数

//获取某个文件中某一范围的所有的线
void CLineIO::getAllLines(malaScreen &pScreen, vector<malaLineFile>&pAllLines, CString &fileName)
{
    CFile file;
    file.Open(LPCTSTR(fileName), CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate);
    CArchive ar(&file, CArchive::load);
    if (pAllLines.size())
        pAllLines.clear();

    vector<malaPoint> tLine;
    malaLinePro tLinePro;
    malaPoint tPoint;
    int pointNum;
    while (1)
    {
        try
        {
            ar >> tLinePro.lineId >> tLinePro.lineStyle >> tLinePro.lineWidth >> tLinePro.lineColor;
            ar >> pointNum;
        }
        catch (CException* e)
        {
            break;
        }

        for (int i = 0; i < pointNum; i++)
        {
            try
            {
                ar >> tPoint.x >> tPoint.y;
            }
            catch (CException* e)
            {
                break;
            }
            tLine.push_back(tPoint);
        }
        //检查是否在可视范围内
        
        malaLogic mylog;
        malaRect lineRc = mylog.getRect(tLine);
        malaRect screenRc;
        screenRc.xmin = pScreen.lbx;
        screenRc.ymin = pScreen.lby;
        ScreenToCoord(pScreen.wScreen, 0, pScreen, &screenRc.xmax, &screenRc.ymax);

        if (mylog.isRectIntersect(lineRc,screenRc))
        {
            malaLineFile MyLine(tLine, tLinePro);
            pAllLines.push_back(MyLine);
        }
        tLine.clear();
    }
}

这里用到的getRect参考文章:VC++开发GIS系统(160)重绘线之获取一个图形的外接矩形,isRectIntersect函数参考:VC++开发GIS系统(161)判断两个矩形是否相交

详细代码可以参考:GitHub

VC++开发GIS系统(161)判断两个矩形是否相交 VC++开发GIS系统(163)重绘线之绘制一条折线

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论