OSGEarth绘制Geometry:绘多边形(三)

原创 2015年07月09日 22:38:15

功能描述如下:
1. 鼠标多次点击的区域绘制多边形,为黄色;
2. 最近一次点击的点以及第一次点击的点和鼠标move到的点之间连线,为两条红色的虚线,表示下次即将绘制的区域块。
代码如下:drawpolygon.h

class DrawPolygon : public HandleAdapter
{
public:
    DrawPolygon(GraphicsView* view);
    ~DrawPolygon();

protected:
    virtual void slotPicked(osg::Vec3d pos);
    virtual void slotMoveing(osg::Vec3d pos);
    virtual void slotRightHandle();

private:
    std::vector<osg::Vec3d> m_vecPoints;

    // 多边形绘制
    osgEarth::Symbology::Style m_polygonStyle;
    osgEarth::Annotation::FeatureNode* m_pFeatureNode;
    osgEarth::Annotation::FeatureEditor* m_pPolygonEdit;

    // 虚线
    osgEarth::Symbology::Style m_stippleLineStyle;
    osgEarth::Annotation::FeatureNode* m_pStippleFeatureNode;
};

功能实现如下:drawpolygon.cpp

DrawPolygon::DrawPolygon(GraphicsView* view)
    : HandleAdapter(view)
{
    m_vecPoints.clear();
    m_pFeatureNode = NULL;
    m_pStippleFeatureNode = NULL;
    m_pPolygonEdit = NULL;

    // 多边形的style
    m_polygonStyle.getOrCreate<osgEarth::Symbology::PolygonSymbol>()
        ->fill()->color() = osgEarth::Symbology::Color::Yellow;
    m_polygonStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
    m_polygonStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_DRAPE;
    m_polygonStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->verticalOffset() = 0.1;

    // 线的style
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->color() = osgEarth::Symbology::Color::Red;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->width() = 2.0;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->tessellation() = 20.0;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_DRAPE;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->verticalOffset() = 0.1;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->stipple() = 255;
}

DrawPolygon::~DrawPolygon()
{

}

void DrawPolygon::slotPicked(osg::Vec3d pos)
{
    m_vecPoints.push_back(pos);
    if (m_vecPoints.size() <= 2)
    {
        return;
    }

    if (m_pPolygonEdit != NULL)
    {
        m_pPolygonEdit->removeChildren(0, m_pPolygonEdit->getNumChildren());
        m_pPolygonEdit = NULL;
    }
    if (m_pFeatureNode == NULL)
    {
        osgEarth::Features::Feature* pFeature = new osgEarth::Features::Feature(
            new osgEarth::Symbology::Polygon,
            m_pMap3D->getSRS(), m_polygonStyle);

        m_pFeatureNode = new osgEarth::Annotation::FeatureNode(
            m_pMap3D->getMapNode(), pFeature);

        m_pLayerGroup->addChild(m_pFeatureNode);
    }

    osgEarth::Symbology::Geometry* pGeometry = m_pFeatureNode->getFeature()->getGeometry();
    pGeometry->clear();
    m_pFeatureNode->setStyle(m_polygonStyle);
    for (int i = 0; i < m_vecPoints.size(); ++i)
    {
        pGeometry->push_back(m_vecPoints[i]);
    }

    m_pFeatureNode->init();
    if (m_pStippleFeatureNode != NULL)
    {
        m_pStippleFeatureNode->getFeature()->getGeometry()->clear();
    }
    if (m_pPolygonEdit == NULL)
    {
        m_pPolygonEdit = new osgEarth::Annotation::FeatureEditor(m_pFeatureNode);
        m_pLayerGroup->addChild(m_pPolygonEdit);
    }
}

void DrawPolygon::slotMoveing(osg::Vec3d pos)
{
    if (m_vecPoints.size() < 2)
    {
        return;
    }
    if (m_pStippleFeatureNode == NULL)
    {
        osgEarth::Features::Feature* pFeature = new osgEarth::Features::Feature(
            new osgEarth::Annotation::LineString,
            m_pMap3D->getSRS(), m_stippleLineStyle);
        m_pStippleFeatureNode = new osgEarth::Annotation::FeatureNode(
            m_pMap3D->getMapNode(), pFeature);

        m_pLayerGroup->addChild(m_pStippleFeatureNode);
    }

    osgEarth::Symbology::Geometry* pGeometry = m_pStippleFeatureNode->getFeature()->getGeometry();
    pGeometry->clear();
    m_pStippleFeatureNode->setStyle(m_stippleLineStyle);
    pGeometry->push_back(m_vecPoints[0]);
    pGeometry->push_back(pos);
    pGeometry->push_back(m_vecPoints[m_vecPoints.size() - 1]);

    m_pStippleFeatureNode->init();
}

void DrawPolygon::slotRightHandle()
{
    m_vecPoints.clear();
    if (m_pStippleFeatureNode != NULL)
    {
        m_pStippleFeatureNode->getFeature()->getGeometry()->clear();
    }
    // 确保下次绘制的多边形和这个没任何关系
    m_pFeatureNode = nullptr;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

OSGEarth绘制Geometry:画线(一)

在OSGEarth中绘制线,首先考虑osgEarth::Annotation::FeatureNode。 功能描述如下: 1. 鼠标两次点击的点之间连线,为黄色的实线; 2. 最近一次点击的点和...
  • chlk118
  • chlk118
  • 2015年07月09日 21:18
  • 5939

osgearth_manip示例解析

/* -*-c++-*- */ /* osgEarth - Dynamic map generation toolkit for OpenSceneGraph * Copyright 2008-2...

OSG绘制几何体学习总结(超全)

在osg中,场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲...

osg 基本几何图元

ogs中所有加入场景中的数据都会加入到一个Group类对象中,几何图元作为一个对象由osg::Geode类来组织管理。绘制几何图元对象时,先创建一个Geometry对象,这个对象中要设置绘制所需的基本...

使用OSG碰撞检测功能检测两点通视

在三维场景中有时需要对两点求其是否可见,即两点之间有没有障碍物的遮挡。在OSG中则可使用碰撞检测完成此功能。 核心的碰撞检测代码为: // 创建需要进行检测的两点之间的线段 osg::...
  • chlk118
  • chlk118
  • 2015年07月13日 22:28
  • 2240

osg创建非凸多边形

使用OpenGL来创建非凸多边形  http://blog.csdn.net/wang15061955806/article/details/50405085 使用OSG来创建非凸多...

OSGEarth的测量分析

我的测量有距离测量、面积测量、高度测量。 测量的结果显示都为一个PlaceNode,可以实时的显示测量的结果。 使用方式为:pPlaceNode = new osgEarth::Annotatio...
  • chlk118
  • chlk118
  • 2015年07月10日 21:09
  • 2765

OSGEarth绘制Geometry:绘圆(二)

功能描述如下: 1. 鼠标点击之处为圆心位置; 2. 以圆心到鼠标move的距离为半径绘圆; 3. 鼠标有点点击结束绘制; 4. 鼠标点击为新的圆心,继续下次绘制。 代码如下:draw...
  • chlk118
  • chlk118
  • 2015年07月09日 21:58
  • 2851

osgEarth开发之三维矢量数据的鼠标选择功能

首先,为了可以实现矢量数据的选择,在矢量数据的加载过程中earth文件需要包含 true 否则,选择不成功 或者在程序中添加代码 osgEarth::Features::FeatureSource...

OSGearth学习(一)

今天开始仔细研究osgearth,osgearth是一个开源的地理信息库,里面有很方便的
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSGEarth绘制Geometry:绘多边形(三)
举报原因:
原因补充:

(最多只允许输入30个字)