青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Visulalize Voronoi in OpenSceneGraph

Posted on 2014-04-30 22:07 eryar 閱讀(2372) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Visulalize 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

1. Introduction

計算幾何(Computational Geometry)作為一門學科,起源于20世紀70年代,經過近四十多年的發展,其研究內容不斷擴大,涉及Voronoi圖、三角剖分、凸包、直線與多邊形求交、可見性、路徑規劃、多邊形剖分等內容。據相關統計,在數以千計的相關文章中,約有15%是關于Voronoi圖及其對偶(dual)圖Delaunay三角剖分(Delaunay Triangulation)的研究。由于Voronoi圖具有最近性、鄰接性等眾多性質和比較系統的理論體系,如今已經在計算機圖形學、機械工程、地理信息系統、機器人、圖像處理、大數據分析與處理、生物計算及無線傳感網絡等領域得到了廣泛應用,同時也是解決碰撞檢測、路徑規劃、可見性計算、骨架計算以及凸包計算等計算幾何所涉及的其他問題的有效工具。

Voronoi圖的起源最早可以追溯到17世紀。1644年,Descartes用類似Voronoi圖的結構顯示太陽系中物質的分布。數學家G.L. Dirichlet和M.G.Voronoi分別于1850年和1908年在他們的論文中討論了Voronoi圖的概念,所以Voronoi圖又叫Dirichlet tessellation。在其他領域,這個概念也曾獨立地出現,如生物學和生理學中稱之為中軸變換(Medial Axis Transform)或骨架(Skeleton)?;瘜W與物理學中稱之為Wigner-Seitz Zones,氣象學與地理學中稱之為Thiessen多邊形。Voronoi圖最早由Thiessen應用于氣象觀測站中隨機分布的研究。由于M.G. Voronoi從更通用的n維情況對其進行研究和定義,所以Voronoi圖這個名稱為大多數人所使用。

在路徑規劃、機械加工、模式識別、虛擬現實、生物計算等領域,將站點從離散點擴展到線段圓弧等生成Voronoi圖的方式也是非常常見的。

目前可用于生成Voronoi圖的庫有一些,很多是開源庫。像CGAL庫、boost中也提供了生成Voronoi圖的算法。本文根據Shane O Sullivans1封裝的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.00.0, yValues[i]));
        theVertices
->push_back(osg::Vec3(xValues[i] + 1.00.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.0f1.0f0.0f1.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.0f0.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();
}

 

上述程序生成結果如下所示:

wps_clip_image-21060

Figure 2.1 Voronoi Diagram in OpenSceneGraph

修改站點的數量,生成的Voronoi圖如下所示:

修改范圍時也要修改生成范圍中點的隨機函數的取余操作,避免生成點超出范圍。

wps_clip_image-21063

Figure 2.2 Less Sites of the Voronoi Diagram

wps_clip_image-15223

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. 汪嘉業, 王文平, 屠長河, 楊承磊. 計算幾何及應用. 科學出版社. 2011

4. 楊承磊, 呂琳, 楊義軍, 孟祥旭. Voronoi圖及其應用. 清華大學出版社. 2013

PDF Version and Source code: Visualization Voronoi in OpenSceneGraph

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲三级影院| 久久精品视频在线看| 欧美激情第10页| av成人国产| 亚洲精品国久久99热| 欧美日韩亚洲激情| 亚洲欧美精品一区| 久久精品人人做人人爽| 亚洲激情女人| 一区二区三区日韩欧美| 国产亚洲一区二区精品| 欧美激情第1页| 欧美日韩视频在线一区二区 | 国产亚洲欧洲| 免费欧美网站| 欧美日韩成人综合在线一区二区| 亚洲欧美久久久久一区二区三区| 小黄鸭精品aⅴ导航网站入口| 在线观看一区视频| 亚洲美女精品成人在线视频| 国产精品一区毛片| 国产精品hd| 欧美一区1区三区3区公司| 久久久成人网| 亚洲午夜视频在线观看| 久久av一区二区三区| 日韩一区二区久久| 香蕉久久夜色| 一区二区三区国产在线观看| 欧美一区二区视频在线| 日韩视频在线免费观看| 欧美在线999| 一区二区三区视频观看| 久久国产精品免费一区| 亚洲一区二区三区色| 久久免费精品日本久久中文字幕| 亚洲永久免费av| 美女尤物久久精品| 欧美在线看片| 欧美日韩中文字幕在线视频| 美国十次了思思久久精品导航| 欧美日韩国产首页| 欧美成人午夜| 狠狠色综合播放一区二区| av成人免费| 日韩视频亚洲视频| 久久中文字幕一区| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩亚洲网| 亚洲国产天堂网精品网站| 激情综合网址| 欧美一区深夜视频| 欧美亚洲日本一区| 国产精品wwwwww| 亚洲精品国产品国语在线app| 亚洲二区三区四区| 久久精品国产精品| 久久频这里精品99香蕉| 国产欧美一区二区精品秋霞影院| 宅男噜噜噜66国产日韩在线观看| 99re6这里只有精品| 欧美激情精品久久久久久变态| 欧美成人亚洲| 91久久中文| 欧美激情亚洲视频| 亚洲人成人77777线观看| 亚洲美女性视频| 农村妇女精品| 亚洲精品国产精品国自产在线| 日韩一级精品| 欧美日韩三区| 亚洲一区免费观看| 欧美伊人久久| 一区二区视频在线观看| 久久久久久久尹人综合网亚洲| 久久深夜福利免费观看| 精品成人国产| 欧美国产日韩精品免费观看| 亚洲精品一区二区三区福利| 亚洲美女中文字幕| 欧美性视频网站| 午夜激情亚洲| 美女主播视频一区| 亚洲精品一级| 欧美午夜精品| 久久gogo国模裸体人体| 亚洲缚视频在线观看| 一区二区三区国产盗摄| 国产精品亚洲产品| 久久久亚洲精品一区二区三区| 亚洲二区精品| 亚洲性感激情| 欲色影视综合吧| 欧美精品在线免费播放| 亚洲欧美另类国产| 欧美高清日韩| 午夜精品国产| **网站欧美大片在线观看| 欧美久久久久久久| 欧美一区国产二区| 91久久精品国产91性色| 西西人体一区二区| 亚洲高清自拍| 国产伦精品一区二区三区视频黑人| 久久久久久久尹人综合网亚洲| 亚洲精品国产精品国自产在线 | 久久久久久久高潮| 亚洲国产小视频在线观看| 国产精品久久午夜| 欧美99在线视频观看| 午夜精品偷拍| 99在线精品免费视频九九视| 美女免费视频一区| 性欧美1819sex性高清| 亚洲另类在线一区| 精品99一区二区| 国产美女精品视频免费观看| 欧美电影免费观看高清| 欧美诱惑福利视频| 亚洲午夜羞羞片| 91久久久久久久久久久久久| 久久这里只精品最新地址| 亚洲一区二区三区高清| 最新国产成人在线观看| 激情综合色综合久久综合| 国产伦精品一区二区三区高清| 欧美日韩成人综合在线一区二区 | 一区二区三区高清不卡| 亚洲第一色在线| 美女图片一区二区| 久久婷婷久久| 久久成人免费| 午夜精品福利视频| 亚洲一级黄色| 一本一本久久| 99精品福利视频| 亚洲欧洲精品一区二区三区不卡 | 篠田优中文在线播放第一区| 99国产精品久久久久久久久久| 亚洲福利视频在线| 亚洲成人在线观看视频| 激情综合中文娱乐网| 国产一区视频在线看| 国产噜噜噜噜噜久久久久久久久 | 欧美日韩一二区| 欧美日韩视频在线| 欧美日韩综合在线| 国产精品久久久久久久久动漫| 欧美日韩精品一区二区三区四区| 欧美激情亚洲国产| 欧美日韩另类一区| 欧美三级网页| 国产女优一区| 国产亚洲一区二区在线观看 | 欧美精品二区三区四区免费看视频| 久久亚洲视频| 欧美精品成人91久久久久久久| 欧美精品一区二区在线观看| 欧美三区在线观看| 国产欧美精品一区二区色综合 | 99在线精品观看| 亚洲在线成人| 久久精品国产成人| 蜜臀91精品一区二区三区| 欧美激情第3页| 99国产精品私拍| 欧美亚洲日本一区| 久久躁狠狠躁夜夜爽| 欧美精品首页| 国产乱肥老妇国产一区二| 激情成人综合网| 亚洲精选视频免费看| 先锋影音国产精品| 美女视频黄免费的久久| 亚洲日本激情| 欧美影院精品一区| 欧美精品一区二区蜜臀亚洲| 国产精品呻吟| 亚洲欧洲一区二区三区| 欧美一乱一性一交一视频| 欧美国产精品劲爆| 亚洲图片欧美午夜| 免费欧美日韩国产三级电影| 国产精品久久久久久久第一福利| 伊人狠狠色丁香综合尤物| 一区二区三区国产在线| 久久尤物视频| 亚洲视频中文字幕| 裸体一区二区| 国产一级精品aaaaa看| 在线综合欧美| 欧美成人午夜视频| 亚洲欧美视频一区| 欧美日韩国产一中文字不卡| 国内激情久久| 亚洲欧美日韩精品| 亚洲国产成人精品久久久国产成人一区| 亚洲一区3d动漫同人无遮挡| 欧美成人午夜免费视在线看片| 国产一区二区三区观看|