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

eryar

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

Triangle - Delaunay Triangulator

Posted on 2014-03-29 16:43 eryar 閱讀(13892) 評論(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)和高質量的三角網格,即生成的網格中沒有瘦長的三角形,所以適用于有限元分析(Finite Element Analysis)。

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

wps_clip_image-6384

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

下載Triangle的源程序及更多與Triangle相關信息的網址如下所示:

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

下載到源程序后,如果是Windows操作系統,還需要在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有很多開關,可以選擇三角剖分和生成網格的方式,如下圖所示:

wps_clip_image-16944

Figure 2.1 Options for the Triangle

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

wps_clip_image-27287

Figure 2.2 Triangle Usage

出現統計信息的同時也生成了一些文件,如頂點文件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

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

wps_clip_image-5805

Figure 3.1 Displaying the Meshes by ShowMe

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

 

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的網格:

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]

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


4. Conclusions

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

將Triangle生成的結果可視化,可以看到Triangle生成的網格,方便看到Triangle的不同選項生成的網格效果。

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

對Delaunay三角剖分算法感興趣的讀者,可以參考相關書籍[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. 汪嘉業 王文平 屠長河 楊承磊. 計算幾何及應用.  科學出版社. 2011

4. 王成恩. 面向科學計算的網格劃分與可視化技術. 科學出版社. 2011

5. 周培德. 計算幾何-算法設計與分析. 清華大學出版社. 2008

6. Berg M D著 鄧俊輝譯. 計算幾何-算法與應用. 清華大學出版社. 2009

 

Feedback

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

@Mr Li

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

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

你好!

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

Best Regards,
Shing Liu

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

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

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

你好!

請仔細看看這段話:

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

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

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

Best Regards,
Shing Liu

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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" “ ,我發現在tricall.c中已經有了,就不用再添加了吧。

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

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

謝謝啦!

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

運行成功就好。

不客氣。

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

2015-07-30 21:40 by LI
樓主您好,我想知道調用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;

這些都是什么意思,要控制三角形的最小角和面積應該怎么設置參數???
謝謝!
網上關于這些介紹比較少,望樓主幫忙,謝謝了!!

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

你好!

那些參數是三角剖分的輸入數據。

控制剖分行為的參數設置是在結構體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'. */

最小角看字面應該是:minangle
最大面積是:maxarea

Best Regards,
Shing Liu

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

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

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

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

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

# re: Triangle - Delaunay Triangulator  回復  更多評論   

2016-03-17 09:34 by 王亞輝
@付振宇
您好,請問您的“press any key to continue”問題是怎么解決的呢?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久成人精品免费播放动漫| 另类天堂视频在线观看| 国产亚洲欧洲997久久综合| 国产精品久久久久9999| 国产一区二区三区久久悠悠色av | 欧美一区二区黄| 亚洲自拍电影| 老司机成人在线视频| 欧美日韩在线一区二区三区| 在线综合+亚洲+欧美中文字幕| 久久精品国产亚洲高清剧情介绍| 中国成人亚色综合网站| 亚洲一区影院| 亚洲国产精品嫩草影院| 99re6这里只有精品| 国产精品美女999| 久久精品欧美日韩| 欧美精品在线看| 久久精品久久99精品久久| 欧美+日本+国产+在线a∨观看| 亚洲视频第一页| 麻豆av福利av久久av| 欧美亚洲日本国产| 欧美日韩在线播放| 影音先锋一区| 日韩一级在线| 在线亚洲自拍| 欧美日韩国产在线播放网站| 麻豆精品在线视频| 国产视频精品va久久久久久| 一区二区三区免费网站| 一道本一区二区| 欧美日韩视频在线一区二区 | 国产精品一区=区| 中文精品视频| 亚洲一区精品视频| 国产拍揄自揄精品视频麻豆| 国产精品久久亚洲7777| 久久久之久亚州精品露出| 亚洲精品偷拍| 久久久久国产一区二区| 亚洲午夜激情免费视频| 欧美激情一区| 亚洲美女性视频| 在线视频你懂得一区| 国产精品国产a| 亚洲视频在线观看免费| 亚洲免费视频观看| 一本到高清视频免费精品| 久久视频在线免费观看| 久久亚洲免费| 亚洲第一页在线| 欧美国产精品va在线观看| 亚洲国产精品99久久久久久久久| 国产精品欧美日韩一区二区| 午夜精彩国产免费不卡不顿大片| 欧美一区二区精品| 国语自产在线不卡| 欧美a级片网| 洋洋av久久久久久久一区| 久久精品99久久香蕉国产色戒| 国产精品色网| 欧美激情欧美激情在线五月| 亚洲视频在线观看视频| 久久综合狠狠综合久久综合88| 国内精品久久久久影院优| 久久青草欧美一区二区三区| 亚洲国产专区校园欧美| 性色一区二区三区| 亚洲人成在线播放| 欧美一区二区三区另类| 99精品免费视频| 极品少妇一区二区三区| 欧美日韩激情网| 久久综合影视| 香蕉久久久久久久av网站| 亚洲国产日韩欧美一区二区三区| 亚洲午夜久久久| 亚洲人成网站色ww在线| 国产精品女同互慰在线看| 欧美激情小视频| 久久综合伊人| 久久久中精品2020中文| 亚洲片在线资源| 亚洲电影免费观看高清| 亚洲精华国产欧美| 亚洲国产毛片完整版| 国产一区二区三区在线观看免费视频 | 久久久亚洲人| 亚洲伊人伊色伊影伊综合网| 亚洲狠狠婷婷| 亚洲精品在线视频| 日韩视频精品| 亚洲午夜羞羞片| 午夜精品久久久久久久99樱桃| 亚洲一区二区三区精品动漫| 亚洲视频在线观看网站| 亚洲欧美视频| 久久久免费精品| 欧美福利在线| 国产欧美日韩不卡免费| 国产视频在线观看一区| 亚洲高清精品中出| 亚洲精品久久久久久下一站| 99视频+国产日韩欧美| 午夜欧美视频| 亚洲国产成人在线| 欧美在线观看网站| 欧美福利精品| 国产日韩欧美日韩大片| 亚洲第一综合天堂另类专| 亚洲成人中文| 羞羞色国产精品| 亚洲人午夜精品| 久久久综合激的五月天| 欧美日韩在线一区二区| 国产一区二三区| 99精品免费| 欧美日韩视频在线观看一区二区三区| 国产精品视频xxxx| 日韩一区二区精品在线观看| 蜜桃伊人久久| 性感少妇一区| 老妇喷水一区二区三区| 欧美亚洲日本国产| 国产区日韩欧美| 先锋影音国产精品| 99视频精品全国免费| 免播放器亚洲一区| 一区在线影院| 久久久久久尹人网香蕉| 亚洲欧美日韩综合国产aⅴ| 欧美视频观看一区| 亚洲欧美资源在线| 亚洲一区在线播放| 国产欧美日韩综合| 久久久久国产精品一区| 午夜精品视频网站| 国产欧美精品一区二区三区介绍| 亚洲视频在线看| 亚洲视频二区| 国产欧美一区视频| 麻豆精品国产91久久久久久| 亚洲少妇自拍| 狠狠色综合网| 亚洲精品中文字| 国产午夜精品理论片a级大结局 | 欧美福利视频一区| 韩国成人福利片在线播放| 欧美一区二区免费观在线| 久久久精品2019中文字幕神马| 国产日韩欧美a| 久久偷看各类wc女厕嘘嘘偷窃| 久久蜜桃资源一区二区老牛| 国产一区日韩二区欧美三区| 亚洲尤物视频网| 久久国产精品亚洲77777| 国产精品丝袜xxxxxxx| 亚洲免费一级电影| 午夜精品久久久久影视| 国产日产高清欧美一区二区三区| 欧美中文日韩| 欧美精品高清视频| 美女免费视频一区| 狠狠色狠狠色综合人人| 亚洲手机成人高清视频| 亚洲卡通欧美制服中文| 欧美一级网站| 欧美亚一区二区| 亚洲老司机av| 午夜视频一区在线观看| 欧美精品v国产精品v日韩精品| 麻豆免费精品视频| 国产主播一区二区三区四区| 欧美一区二区视频在线观看| 亚洲网站在线观看| 欧美私人网站| 亚洲欧美久久久久一区二区三区| 亚洲国产日韩一区二区| 欧美韩日一区| 亚洲精品日韩在线观看| 亚洲一级黄色av| 国产精品sss| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲午夜免费视频| 欧美激情综合亚洲一二区| 中国成人黄色视屏| 久久久91精品国产| 日韩一级黄色av| 国产模特精品视频久久久久| 亚洲欧美久久久| 亚洲欧洲免费视频| 久久激情中文| 日韩一二在线观看| 国产亚洲福利社区一区| 欧美高清视频一区二区| 欧美一区二区三区男人的天堂| 欧美搞黄网站| 欧美在线综合| 先锋影音久久久|