mobile.365-838.comVisulalization Voronoi in OpenSceneGraph

Visulalization Voronoi in
OpenSceneGraph

eryar@163.com

Abstract. In mathematics a
Voronoi diagram is a way of dividing space into a number of regions. A
set of points, called seeds, sites, or generators is specified
beforehand and for each seed there will be a correspoinding region
consisting of all points closer to that seed than to any other. The
regions are called Voronoi cells. It is dual to the Delaunay
triangulation. It is named after Georgy Voronoy, and is also called a
Voronoi tessellation, a Voronoi decomposition, a Voronoi partition, or a
Dirichlet tessellation. Voronoi diagrams can be found in a large number
of fields in science and technology, even in art, and they have found
numerous practical and theoretical applications. The paper use
OpenSceneGraph to visualize the Voronoi diagram. 

Key words. Voronoi, C++,
OpenSceneGraph, Visualization 

mobile.365-838.com,1. Introduction

测算几何(Computational
吉优metry)作为壹门课程,源点于20世纪70时代,经过近四十多年的迈入,其商讨内容不断扩张,涉及Voronoi图、三角剖分、凸包、直线与绝大多数形求交、可知性、路径设计、多边形剖分等剧情。据有关总括,在数以千计的连带文章中,约有一五%是关于Voronoi图及其对偶(dual)图Delaunay三角剖分(Delaunay
Triangulation)的探讨。由于Voronoi图具有方今性、邻接性等众多品质和比较系统的理论种类,近日儿中午已在总括机图形学、机械工程、地理音信体系、机器人、图像处理、大数目解析与拍卖、生物资总公司结及有线传感网络等世界得到了广泛应用,同时也是缓解碰撞检查实验、路径设计、可知性总计、骨架计算以及凸包计算等总括几何所波及的其余标题的管用工具。 

Voronoi图的来自最早可以追溯到一7世纪。164肆年,Descartes用接近Voronoi图的组织呈现太阳系中物质的遍布。科学家G.L.
Dirichlet和M.G.Voronoi分别于1850年和一九一零年在她们的随想中探讨了Voronoi图的定义,所以Voronoi图又叫Dirichlet
tessellation。在其它世界,那个定义也曾独立地涌出,如生物学和生文学中称之为中轴变换(Medial
Axis Transform)或骨架(Skeleton)。化学与物农学中称之为Wigner-Seitz
Zones,气象学与地法学中称之为Thiessen多边形。Voronoi图最早由Thiessen应用于场景色测站中任意分布的钻研。由于M.G.
Voronoi从更通用的n维景况对其展开讨论和概念,所以Voronoi图那一个名为多数人所使用。 

在路线设计、机械加工、形式识别、虚拟现实、生物资总公司结等领域,将站点从离散点扩充到线段圆弧等变化Voronoi图的办法也是可怜广阔的。 

当下可用以转移Voronoi图的库有一些,很多是开源库。像CGAL库、boost中也提供了生成Voronoi图的算法。本文依照Shane
O Sullivans一封装的Voronoi库,并用OpenSceneGraph呈现出剖分结果。 

2. Implementation

用Shane O
Sullivans封装的VoronoiDiagramGenerator能够生成点集的Voronoi图,获得剖分的线条。程序小巧,易于使用。结合OpenSceneGraph将剖分获得的线条呈现出来。程序代码如下所示:

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2014-04-30 18:28
*        Version : V1.0
*
*    Description : VoronoiViewer for voronoi library visulization.
*
*/

#include "VoronoiDiagramGenerator.h"

// OpenSceneGraph library.
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgGA/StateSetManipulator>
#include <osgViewer/ViewerEventHandlers>

#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgViewerd.lib")


osg::Node* BuildVoronoi(void)
{
    osg::ref_ptr<osg::Geode> theGeode = new osg::Geode();
    osg::ref_ptr<osg::Geometry> theLines = new osg::Geometry();
    osg::ref_ptr<osg::Vec3Array> theVertices = new osg::Vec3Array();

    const long thePointCount = 10;
    float *xValues = new float[thePointCount] ();
    float *yValues = new float[thePointCount] ();

    float theMin = 0.0;
    float theMax = 100.0;

    float x1 = 0.0;
    float y1 = 0.0;
    float x2 = 0.0;
    float y2 = 0.0;

    // Draw the boundary box.
    theVertices->push_back(osg::Vec3(theMin, 0.0, theMin));
    theVertices->push_back(osg::Vec3(theMin, 0.0, theMax));

    theVertices->push_back(osg::Vec3(theMin, 0.0, theMin));
    theVertices->push_back(osg::Vec3(theMax, 0.0, theMin));

    theVertices->push_back(osg::Vec3(theMin, 0.0, theMax));
    theVertices->push_back(osg::Vec3(theMax, 0.0, theMax));

    theVertices->push_back(osg::Vec3(theMax, 0.0, theMin));
    theVertices->push_back(osg::Vec3(theMax, 0.0, theMax));

    // initialize random seed:
    srand(time(NULL));

    // Sites of the Voronoi.
    for (int i = 0; i < thePointCount; ++i)
    {
        xValues[i] = rand() % 100;
        yValues[i] = rand() % 100;

        // Draw the site.
        theVertices->push_back(osg::Vec3(xValues[i] - 1.0, 0.0, yValues[i]));
        theVertices->push_back(osg::Vec3(xValues[i] + 1.0, 0.0, yValues[i]));

        theVertices->push_back(osg::Vec3(xValues[i], 0.0, yValues[i] - 1.0));
        theVertices->push_back(osg::Vec3(xValues[i], 0.0, yValues[i] + 1.0));
    }

    // Generate Voronoi Diagram.
    VoronoiDiagramGenerator vdg;
    vdg.generateVoronoi(xValues, yValues, thePointCount, theMin, theMax, theMin, theMax);
    vdg.resetIterator();

    while (vdg.getNext(x1, y1, x2, y2))
    {
        theVertices->push_back(osg::Vec3(x1, 0.0, y1));
        theVertices->push_back(osg::Vec3(x2, 0.0, y2));
    }

    theLines->setVertexArray(theVertices);

    // Set the colors.
    osg::ref_ptr<osg::Vec4Array> theColors = new osg::Vec4Array();
    theColors->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));

    theLines->setColorArray(theColors);
    theLines->setColorBinding(osg::Geometry::BIND_OVERALL);

    // Set the normal.
    osg::ref_ptr<osg::Vec3Array> theNormals = new osg::Vec3Array();
    theNormals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));

    theLines->setNormalArray(theNormals);
    theLines->setNormalBinding(osg::Geometry::BIND_OVERALL);

    theLines->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, theVertices->size()));

    theGeode->addDrawable(theLines);

    // Free the meomry.
    delete [] xValues;
    delete [] yValues;

    return theGeode.release();
}


int main(int argc, char* argv[])
{
    osgViewer::Viewer myViewer;

    myViewer.setSceneData(BuildVoronoi());

    myViewer.addEventHandler(new osgGA::StateSetManipulator(myViewer.getCamera()->getOrCreateStateSet()));
    myViewer.addEventHandler(new osgViewer::StatsHandler);
    myViewer.addEventHandler(new osgViewer::WindowSizeHandler);

    return myViewer.run();
}

 上述顺序生成结果如下所示: 

mobile.365-838.com 1

Figure 2.1 Voronoi Diagram in OpenSceneGraph 

修改站点的数码,生成的Voronoi图如下所示: 

修改范围时也要修改生成范围中式点心的任性函数的取余操作,制止生成点超出范围。 

mobile.365-838.com 2

Figure 2.2 Less Sites of the Voronoi Diagram 

mobile.365-838.com 3

Figure 2.3 More Sites of the Voronoi Diagram 

3. Conclusion

Shane O
Sullivans封装的库小巧,使用方便,速度还一点也不慢。也略微欠缺,如不能够获取三个站点对应的多方形,即有些点属于哪个区域。无法收获带权点集的Voronoi剖分。 

源程序小巧,借助程序代码来对Voronoi的概念进行精通照旧不错的。 

4. References

  1. Shane O Sullivans, http://www.skynet.ie/~sos/mapviewer/voronoi.php

  2. http://ect.bell-labs.com/who/sjf/

  3. 汪嘉业, 王文平, 屠长河, 杨承磊. 总结几何及应用. 科学出版社. 201壹 

  4. 杨承磊, 吕琳, 杨义军, 孟祥旭. Voronoi图及其应用. 浙大东军政高校学出版社. 201三

PDF Version and Source code: Visualization Voronoi in
OpenSceneGraph

admin

网站地图xml地图