• <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>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Triangle - Delaunay Triangulator

            Posted on 2014-03-29 16:43 eryar 閱讀(13792) 評論(17)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE


            Triangle - Delaunay Triangulator

            eryar@163.com

            Abstract. Triangle is a 2D quality mesh generator and Delaunay triangulator. Triangle was created as part of the Quake project in the school of Computer Science at Carnegie Mellon University by Jonathan R. Shewchuk. Triangle is a small C program and its Delaunay refinement algorithm for quality mesh generation is a hybrid one. It includes divide-and-conquer and incremental insertion algorithms and sweepline Delaunay triangulation algorithm. This paper is focused on the usage of the Triangle and visualization the triangulation result in OpenSceneGraph.

            Key words. Triangle, Delaunay Triangulator, Mesh Generator

            1. Introduction

            Triangle可以生成精確的Delaunay三角剖分,限定Delaunay三角剖分(Constrained Delaunay Triangulation),Conforming Delaunay Triangulation,Voronoi圖(Voronoi Diagrams)和高質(zhì)量的三角網(wǎng)格,即生成的網(wǎng)格中沒有瘦長的三角形,所以適用于有限元分析(Finite Element Analysis)。

            在OpenCascade6.2.0版本之前,OpenCascade中網(wǎng)格的生成就是使用了這個開源庫,由此可見Delaunay三角剖分算法和網(wǎng)格生成算法的重要性及廣泛應(yīng)用。

            wps_clip_image-6384

            Figure 1.1 Triangle - A 2D Quality Mesh Generator and Delaunay Triangulator

            下載Triangle的源程序及更多與Triangle相關(guān)信息的網(wǎng)址如下所示:

            http://www.cs.cmu.edu/~quake/triangle.html

            下載到源程序后,如果是Windows操作系統(tǒng),還需要在triangle.h之前做些配置,如定義以下幾個宏:

            #define REAL double 
            #define ANSI_DECLARATORS 
            #include 
            "triangle.h" 
            #undef REAL 

            在triangle.c中定義宏:#define NO_TIMER。有了上面的宏定義,可以編譯出一個triangle.exe程序了。如果要將triangle用在自己的程序中,還需要定義#define TRILIBRARY。更多宏定義可以參考源程序。


            2. Triangle Usage

            Triangle有很多開關(guān),可以選擇三角剖分和生成網(wǎng)格的方式,如下圖所示:

            wps_clip_image-16944

            Figure 2.1 Options for the Triangle

            如對示例文件box.poly進行三角剖分,使用命令及生成結(jié)果統(tǒng)計信息如下所示:

            wps_clip_image-27287

            Figure 2.2 Triangle Usage

            出現(xiàn)統(tǒng)計信息的同時也生成了一些文件,如頂點文件box.1.node和三角形文件box.1.ele,如下圖所示:

            wps_clip_image-2721

            Figure 2.3 Nodes and Triangles data generated by Triangle

            wps_clip_image-3509

            Figure 2.4 Triangulation Mesh Generated by Triangle[-pc]

            wps_clip_image-3599

            Figure 2.5 Triangulation Mesh Generated by Triangle[-pqc]

            3. Displaying Meshes

            在下載的程序中有用于顯示網(wǎng)格的示例程序showme.c,不過只能用于Unix操作系統(tǒng),不能用于Windows。

            wps_clip_image-5805

            Figure 3.1 Displaying the Meshes by ShowMe

            為了在Windows操作系統(tǒng)中看到生成的網(wǎng)格,用OpenSceneGraph編寫了一個小程序TriangleViewer顯示網(wǎng)格。其中讀取node和element文件中數(shù)據(jù)的主要程序片段如下所示:

             

            std::string TriangleMesh::ReadLine(std::ifstream &theFile)
            {
                std::
            string theBuffer;

                
            bool IsReadNextLine = false;

                
            do 
                {
                    getline(theFile, theBuffer);

                    
            // skip comment here.
                    if ('#' == theBuffer[0])
                    {
                        IsReadNextLine 
            = true;
                    }
                    
            else
                    {
                        IsReadNextLine 
            = false;
                    }
                }
                
            while (IsReadNextLine);

                
            return theBuffer;
            }

            void TriangleMesh::BuildMesh(const std::string& aPolyFile)
            {
                std::stringstream ss;

                std::
            string theNodeFileName(aPolyFile + ".node");
                std::
            string theElementFileName(aPolyFile + ".ele");

                std::ifstream theNodeFile(theNodeFileName.c_str());
                std::ifstream theElementFile(theElementFileName.c_str());

                Standard_Integer theIndex 
            = 0;
                Standard_Integer theNodeCount 
            = 0;
                Standard_Integer theTriangleCount 
            = 0;

                Standard_Integer theIndex1 
            = 0;
                Standard_Integer theIndex2 
            = 0;
                Standard_Integer theIndex3 
            = 0;

                Standard_Real x 
            = 0.0;
                Standard_Real y 
            = 0.0;

                
            // Read mesh size.
                ss << ReadLine(theNodeFile);
                ss 
            >> theNodeCount;

                ss.str(
            "");
                ss.clear();

                ss 
            << ReadLine(theElementFile);
                ss 
            >> theTriangleCount;

                mMesh 
            = new Poly_Triangulation(theNodeCount, theTriangleCount, Standard_True);

                
            // Read nodes information.
                TColgp_Array1OfPnt2d& theNodes2d = mMesh->ChangeUVNodes();

                
            for (Standard_Integer n = 1; n <= theNodeCount; ++n)
                {
                    ss.str(
            "");
                    ss.clear();

                    ss 
            << ReadLine(theNodeFile);
                    ss 
            >> theIndex >> x >> y;

                    theNodes2d.SetValue(theIndex, gp_Pnt2d(x, y));
                }

                
            // Read triangles information.
                Poly_Array1OfTriangle& theTriangles = mMesh->ChangeTriangles();

                
            for (Standard_Integer t = 1; t <= theTriangleCount; ++t)
                {
                    ss.str(
            "");
                    ss.clear();

                    ss 
            << ReadLine(theElementFile);
                    ss 
            >> theIndex >> theIndex1 >> theIndex2 >> theIndex3;

                    theTriangles.SetValue(theIndex, Poly_Triangle(theIndex1, theIndex2, theIndex3));
                }
            }

            如下圖所示為顯示一個用不同命令生成的Smiley Face的網(wǎng)格:

            wps_clip_image-11392

            Figure 3.2 Generate Smiley Face Mesh by Triangle [-pc]

            wps_clip_image-13806

            Figure 3.3 Generate Smiley Face Mesh by Triangle [-pqc]

            從上面兩幅圖中的網(wǎng)格可知,下面圖中的網(wǎng)格質(zhì)量較高,為去掉了瘦長的三角形而增加了一些頂點。


            4. Conclusions

            在給Triangle程序輸入數(shù)據(jù)時,頂點Vertex數(shù)據(jù)很好理解,只是一些二維點,但是如果加上開孔Hole后有些問題。后來才知道,需要在Poly文件中的Segments部分輸入與孔相關(guān)線段形成的閉合區(qū)域,在孔Hole部分只需要輸入位于孔中的任意一個點即可。

            將Triangle生成的結(jié)果可視化,可以看到Triangle生成的網(wǎng)格,方便看到Triangle的不同選項生成的網(wǎng)格效果。

            在OpenCascade6.2.0版本中,就以此二維Delaunay三角剖分工具為基礎(chǔ),實現(xiàn)了任意三維曲面的三角剖分,進而對其可視化。所以學(xué)習(xí)Triangle的用法,結(jié)合OpenCascade的源程序便于理解任意曲面的可視化實現(xiàn)的方法。

            對Delaunay三角剖分算法感興趣的讀者,可以參考相關(guān)書籍[3],[4],[5],[6]。


            5. References

            1. Jonathan R. Shewchuk. Triangle: http://www.cs.cmu.edu/~quake/triangle.html

            2. Jonathan R. Shewchuk, Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangualtor, Springer-Verlag, Berlin, 1996

            3. 汪嘉業(yè) 王文平 屠長河 楊承磊. 計算幾何及應(yīng)用.  科學(xué)出版社. 2011

            4. 王成恩. 面向科學(xué)計算的網(wǎng)格劃分與可視化技術(shù). 科學(xué)出版社. 2011

            5. 周培德. 計算幾何-算法設(shè)計與分析. 清華大學(xué)出版社. 2008

            6. Berg M D著 鄧俊輝譯. 計算幾何-算法與應(yīng)用. 清華大學(xué)出版社. 2009

             

            Feedback

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2014-05-04 10:58 by Mr Li
            我正在研究這個三角剖分的源碼

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2014-05-04 15:42 by eryar
            厲害!

            @Mr Li

            # re: Triangle - Delaunay Triangulator[未登錄]  回復(fù)  更多評論   

            2014-05-19 14:46 by D
            怎么在tcl語言中呢

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2014-05-20 21:30 by eryar
            這個可以參考netgen,
            @D

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-01-14 15:20 by 付振宇
            樓主你好,我運行Triangle之后,結(jié)果確實產(chǎn)生了一系列的開關(guān)選擇項,但結(jié)果的最后一行卻是“press any key to continue”,直接不給我選擇開關(guān)的 機會程序就結(jié)束了,請問怎么才能選擇這些開關(guān)呢?

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-01-14 18:17 by eryar
            @付振宇
            Hi 付振宇,

            你好!

            Triangle的用法請參考Figure 2.2 Triangle Usage 中紅色線框中的部分。
            各開關(guān)的用法請仔細看Figure 2.1 Options for the Triangle其說明。

            Best Regards,
            Shing Liu

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-01-15 14:14 by 付振宇
            @eryar
            感謝博主,我現(xiàn)在明白了,原來是在命令提示符里運行源程序編譯產(chǎn)生的exe文件和相應(yīng)的開關(guān)指令,而并非在Visual c++里運行。

            可是為什么產(chǎn)生的結(jié)點坐標(biāo)和單元信息文件的后綴名是.node和.ele呢,能否通過修改源程序讓它們都為.txt文件,然后再編寫一段c++程序讀出這些信息,畫出網(wǎng)格剖分圖?

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-01-15 17:55 by eryar
            @付振宇

            生成的文件后綴名沒有什么關(guān)系的,對于程序來說都是文本文件,自己寫程序直接讀數(shù)據(jù)都可以了。

            有些程序可以用來顯示Triangle生成的這些文件,加個后綴好分辨文件中保存的數(shù)據(jù)。

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-03-10 15:03 by 付振宇
            @eryar
            博主您好,我想用源文件夾中的tricall.c來調(diào)用triangle,于是在triangle.c中定義了#define TRILIBRARY,并把tricall.c添加到工作空間來,可是編譯的時候總是報錯,問題就出在頭文件triangle.h中的一行奇怪代碼上
            “#include "triangle.h"
            給出的錯誤提示貌似是說出現(xiàn)了循環(huán)調(diào)用,于是我就把“#include "triangle.h"給刪除了,然后再編譯,這下一編譯更不得了,出現(xiàn)了幾十個語法錯誤。

            請問這到底是怎么回事,為什么triangle.h要自己引用自己,怎么解決這個問題?

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-03-10 19:21 by eryar
            @付振宇
            Hi 付振宇,

            你好!

            請仔細看看這段話:

            ~~~~~~~~~~~~~~~~~~~~~~~~~
            下載到源程序后,如果是Windows操作系統(tǒng),還需要在triangle.h之前做些配置,如定義以下幾個宏:
            #define REAL double
            #define ANSI_DECLARATORS
            #include "triangle.h"
            #undef REAL

            在triangle.c中定義宏:#define NO_TIMER。有了上面的宏定義,可以編譯出一個triangle.exe程序了。如果要將triangle用在自己的程序中,還需要定義#define TRILIBRARY。
            ~~~~~~~~~~~~~~~~~~~~~~~~~~
            這些內(nèi)容加在tricall.c中,再編譯試試看。

            你可以看看makefile,里面有些選項的。

            Best Regards,
            Shing Liu

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-03-10 20:02 by 付振宇
            @eryar
            您的意思是在triangle.h中定義宏:
            #define REAL double
            #define ANSI_DECLARATORS

            在triangle.c中定義宏:
            #define NO_TIMER
            #define TRILIBRARY


            至于那個” #include "triangle.h" “ ,我發(fā)現(xiàn)在tricall.c中已經(jīng)有了,就不用再添加了吧。

            按照上面的做法,最終運行成功了。

            我之前是把下面的代碼都添加到了triangle.h中,才報錯的。
            #define REAL double
            #define ANSI_DECLARATORS
            #include "triangle.h"
            #undef REAL

            謝謝啦!

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-03-11 19:30 by eryar
            @付振宇

            運行成功就好。

            不客氣。

            # re: Triangle - Delaunay Triangulator[未登錄]  回復(fù)  更多評論   

            2015-07-30 21:40 by LI
            樓主您好,我想知道調(diào)用Triangle中 triangulateio 里面定義的
            REAL *pointattributelist;
            int *pointmarkerlist;
            int numberofpointattributes;

            int *trianglelist;
            REAL *triangleattributelist;
            REAL *trianglearealist;
            int *neighborlist;
            int numberoftriangles;
            int numberofcorners;
            int numberoftriangleattributes;*/

            int *segmentlist;
            int *segmentmarkerlist;
            int numberofsegments;
            REAL *holelist;
            int numberofholes;

            REAL *regionlist;
            int numberofregions;

            int *edgelist;
            int *edgemarkerlist;
            REAL *normlist;
            int numberofedges;

            這些都是什么意思,要控制三角形的最小角和面積應(yīng)該怎么設(shè)置參數(shù)???
            謝謝!
            網(wǎng)上關(guān)于這些介紹比較少,望樓主幫忙,謝謝了??!

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-07-30 22:52 by eryar
            @LI

            你好!

            那些參數(shù)是三角剖分的輸入數(shù)據(jù)。

            控制剖分行為的參數(shù)設(shè)置是在結(jié)構(gòu)體behavior中:
            /* Data structure for command line switches and file names. This structure */
            /* is used (instead of global variables) to allow reentrancy. */

            struct behavior {

            /* Switches for the triangulator. */
            /* poly: -p switch. refine: -r switch. */
            /* quality: -q switch. */
            /* minangle: minimum angle bound, specified after -q switch. */
            /* goodangle: cosine squared of minangle. */
            /* vararea: -a switch without number. */
            /* fixedarea: -a switch with number. */
            /* maxarea: maximum area bound, specified after -a switch. */
            /* usertest: -u switch. */
            /* regionattrib: -A switch. convex: -c switch. */
            /* weighted: 1 for -w switch, 2 for -W switch. jettison: -j switch */
            /* firstnumber: inverse of -z switch. All items are numbered starting */
            /* from `firstnumber'. */
            /* edgesout: -e switch. voronoi: -v switch. */
            /* neighbors: -n switch. geomview: -g switch. */
            /* nobound: -B switch. nopolywritten: -P switch. */
            /* nonodewritten: -N switch. noelewritten: -E switch. */
            /* noiterationnum: -I switch. noholes: -O switch. */
            /* noexact: -X switch. */
            /* order: element order, specified after -o switch. */
            /* nobisect: count of how often -Y switch is selected. */
            /* steiner: maximum number of Steiner points, specified after -S switch. */
            /* incremental: -i switch. sweepline: -F switch. */
            /* dwyer: inverse of -l switch. */
            /* splitseg: -s switch. */
            /* nolenses: -L switch. docheck: -C switch. */
            /* quiet: -Q switch. verbose: count of how often -V switch is selected. */
            /* usesegments: -p, -r, -q, or -c switch; determines whether segments are */
            /* used at all. */
            /* */
            /* Read the instructions to find out the meaning of these switches. */

            int poly, refine, quality, vararea, fixedarea, usertest;
            int regionattrib, convex, weighted, jettison;
            int firstnumber;
            int edgesout, voronoi, neighbors, geomview;
            int nobound, nopolywritten, nonodewritten, noelewritten, noiterationnum;
            int noholes, noexact, nolenses;
            int incremental, sweepline, dwyer;
            int splitseg;
            int docheck;
            int quiet, verbose;
            int usesegments;
            int order;
            int nobisect;
            int steiner;
            REAL minangle, goodangle;
            REAL maxarea;

            /* Variables for file names. */

            #ifndef TRILIBRARY
            char innodefilename[FILENAMESIZE];
            char inelefilename[FILENAMESIZE];
            char inpolyfilename[FILENAMESIZE];
            char areafilename[FILENAMESIZE];
            char outnodefilename[FILENAMESIZE];
            char outelefilename[FILENAMESIZE];
            char outpolyfilename[FILENAMESIZE];
            char edgefilename[FILENAMESIZE];
            char vnodefilename[FILENAMESIZE];
            char vedgefilename[FILENAMESIZE];
            char neighborfilename[FILENAMESIZE];
            char offfilename[FILENAMESIZE];
            #endif /* not TRILIBRARY */

            }; /* End of `struct behavior'. */

            最小角看字面應(yīng)該是:minangle
            最大面積是:maxarea

            Best Regards,
            Shing Liu

            # re: Triangle - Delaunay Triangulator[未登錄]  回復(fù)  更多評論   

            2015-08-03 13:30 by LI
            @eryar
            謝謝您的答復(fù)!
            但是我還有一些疑問,寫在給您的郵件中,期待您的回復(fù)!
            謝謝!

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2015-08-04 21:26 by eryar
            @LI
            不客氣。

            建議你還是先把triangle編譯出一個exe,仔細看看相關(guān)命令選項,
            如"-a"就可以設(shè)置最大面積約束;

            再把你的數(shù)據(jù)放到文件中,再用那個exe程序帶不同的選項來試試看。

            # re: Triangle - Delaunay Triangulator  回復(fù)  更多評論   

            2016-03-17 09:34 by 王亞輝
            @付振宇
            您好,請問您的“press any key to continue”問題是怎么解決的呢?
            亚洲欧美日韩精品久久| 热RE99久久精品国产66热| 久久综合给久久狠狠97色| 国产成人久久AV免费| 内射无码专区久久亚洲| 久久AV高清无码| 久久强奷乱码老熟女网站| 久久精品国产亚洲精品2020| 伊人久久精品线影院| 一本色道久久综合狠狠躁| 亚洲国产二区三区久久| 东方aⅴ免费观看久久av| 久久国产视频网| 日韩AV无码久久一区二区| 日韩久久久久中文字幕人妻| 久久国产精品无码一区二区三区| 人人狠狠综合88综合久久| 国产一久久香蕉国产线看观看| 亚洲国产婷婷香蕉久久久久久| 2020久久精品国产免费| 亚洲午夜久久久久久噜噜噜| 无码乱码观看精品久久| 欧美亚洲另类久久综合| 午夜天堂av天堂久久久| 中文字幕无码久久精品青草| 国产精品狼人久久久久影院 | 国色天香久久久久久久小说| 久久亚洲欧美日本精品| 久久久久久午夜成人影院| 久久妇女高潮几次MBA| 国产免费久久精品99re丫y| 久久久99精品成人片中文字幕| 国内精品久久久久| 久久国产精品无码一区二区三区| 少妇熟女久久综合网色欲| 久久综合亚洲鲁鲁五月天| 亚洲?V乱码久久精品蜜桃| 久久影院午夜理论片无码| 日韩中文久久| 久久综合鬼色88久久精品综合自在自线噜噜| 国产福利电影一区二区三区久久久久成人精品综合|