OSGEarth绘制Geometry:绘圆(二)

原创 2015年07月09日 21:58:31

功能描述如下:
1. 鼠标点击之处为圆心位置;
2. 以圆心到鼠标move的距离为半径绘圆;
3. 鼠标有点点击结束绘制;
4. 鼠标点击为新的圆心,继续下次绘制。
代码如下:drawcircle.h

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

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

private:
    osg::Vec3d m_centerPoint;

    osgEarth::Symbology::Style m_circleStyle;
    osgEarth::Annotation::CircleNode* m_pCircleNode;
    osgEarth::Annotation::CircleNodeEditor* m_pCircleEdit;
};

功能代码如下:drawcircle.cpp

DrawCircle::DrawCircle(GraphicsView* view)
    : HandleAdapter(view)
{
    m_centerPoint = osg::Vec3d();
    m_pLayerGroup->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
    m_pCircleNode = NULL;
    m_pCircleEdit = NULL;

    m_circleStyle.getOrCreate<osgEarth::Symbology::PolygonSymbol>()
        ->fill()->color() = osgEarth::Symbology::Color::Yellow;
    m_circleStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
    m_circleStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_DRAPE;
    m_circleStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->verticalOffset() = 0.1;
}

DrawCircle::~DrawCircle()
{

}

void DrawCircle::slotPicked(osg::Vec3d pos)
{
    if (m_centerPoint == osg::Vec3d() && pos == osg::Vec3d())
    {
        return;
    }
    else if (m_centerPoint == osg::Vec3d())
    {
        m_centerPoint = pos;
    }

    if (m_pCircleNode == NULL)
    {
        m_pCircleNode = new osgEarth::Annotation::CircleNode(
            m_pMap3D->getMapNode(),
            osgEarth::GeoPoint::GeoPoint(m_pMap3D->getSRS(),
            m_centerPoint, osgEarth::AltitudeMode::ALTMODE_RELATIVE),
            osgEarth::Linear::Linear(50, osgEarth::Units::METERS),
            m_circleStyle,
            osgEarth::Angular::Angular(0.0, osgEarth::Units::DEGREES));

        m_pCircleEdit = new osgEarth::Annotation::CircleNodeEditor(m_pCircleNode);
        m_pLayerGroup->addChild(m_pCircleNode);
        m_pLayerGroup->addChild(m_pCircleEdit);
    }

    m_pCircleNode->setRadius(
        osgEarth::GeoMath::distance(m_centerPoint, pos, m_pMap3D->getSRS()));
}

void DrawCircle::slotMoveing(osg::Vec3d pos)
{
    if (m_pCircleNode != NULL && m_centerPoint != osg::Vec3d())
    {
        m_pCircleNode->setRadius(
            osgEarth::GeoMath::distance(m_centerPoint, pos, m_pMap3D->getSRS()));
    }
}

void DrawCircle::slotRightHandle()
{
    // 保证下次绘制的为新的圆
    m_centerPoint = osg::Vec3d();
    m_pCircleNode = NULL;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

osgearth各个例子功能概述

最近在学习osgearth,对其还不是很理解,有些例子不会运行,有些可以,把可以的做个统计,以备后面查用。 1、osgearth_graticule:生成经纬线。 2、osgearth_annotat...

OSG在MFC多窗口的使用

OpenSceneGraph的例子中有如何在MFC中使用OSG的,也有如何在控制台中使用多视图多窗口渲染的例子,但是如果只是将这两个例子简单的结合在一起的话程序是会出问题的。还有一些细节上面的变化需要...

osgearth API编程动态建立一个地球!

在研究了怎么样用earth文件来建立地球之后,我开始着手实现很多osgearth学习笔记中的API编程来建立地球。可是我照着其中的例子(http://blog.csdn.net/whucv/artic...

osgearth加载本地离线影像瓦片地图

osgearth加载本地离线影像瓦片地图案例 说明 本实例演示重新编译bing驱动直接加载本地离线影像瓦片地图。 本实例使用软件版本:osg3.3.1和osgEarth2.5 VC10编译环境(参考o...

OSG入门即osgEarth建立一个地球的详细步骤

最近在学习有关osg的知识,刚开始一头雾水,幸好在老师的指导下才茅塞顿开,同时又结合网上的多个资料总结 一下作为一个初学者入门的经验。希望广大初学者少走弯路!   开始osg编程之前要做osg的编...

OSGearth学习(一)

今天开始仔细研究osgearth,osgearth是一个开源的地理信息库,里面有很方便的

osgearth_manip示例解析

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

osgEarthSamples1.0运行事例

osgEarthSamples是一个osgEarth测试事例运行程序,用户可在系统中设置测试事例目录加载.earth后缀xml文档,对文档进行格式化显示,可编辑,保存。 1、文件-->打开驱动器设定“...

osgearth访问几种数据的几种方式

osgearth访问数据分类方式可以分为使用earth文件加载和通过程序加载。 1.earth文件方式比较简单方便 只要掌握一定的格式就能访问各种数据,下面就给出一个例子:访问网上的Arc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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