posts - 415, comments - 576, trackbacks - 0, articles - 0
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet

OpenCascade中的Delaunay三角剖分

Posted on 2013-05-26 16:51 eryar 阅览(18346) 谈论(17)  修改 保藏 引证 所属分类: 2.OpenCASCADE

Delaunay Triangulation in OpenCascade

eryar@163.com

摘要:本文扼要介绍了Delaunay三角剖分的基础理论,并运用OpenCascade的三角剖分算法将鸿沟BRep表明的几许体进行三角离散化后在OpenSceneGraph中显现。

关键字:Delaunay Triangulation、OpenCascade、OpenSceneGraph

一、 概述

三角剖分是平面剖分中的一个重要课题,在数字图画处理、核算机三维曲面造型、有限元核算、逆向工程等范畴有着广泛运用。由于三角形是平面域中的单纯形,与其他平面图形比较,其有描绘便利、处理简略等特性,很适合于对杂乱区域进行简化处理。因而,不管在核算几许、核算机图形处理、模式识别、曲面迫临,还有有限元网格生成方面有广泛的运用。

尽管曲线、曲面等有准确的方程来表明,但是在在核算机中,只能用离散的办法来迫临。如曲线可用直线段来迫临,而曲面可用多边形或三角形来表明。用多边形网格表明曲面是规划中常常运用的方式,能够依据运用要求挑选网格的密度。运用三角形面片表明的曲面在核算机图形学中也称为三角形网格。用三角形网格表明曲面需求处理几个问题:三角形的发生、描绘、遍历、简化和紧缩等,这些问题都是核算几许研讨的范畴,相关问题都能够从中找到答案。下图所示的圆柱和立方体是由OpenCascade生成,运用OpenCascade的算法离散成三角网格后在OpenSceneGraph中显现的效果。

wps_clip_image-27228

Figure 1.1 Shaded Cylinder and Box

wps_clip_image-22196

Figure 1.2 Mesh generated by OpenCascade

从图中能够看出,平面的三角形网格效果还不错,曲面的三角形网格表明只能是近似表明,能够经过进步网格的密度来添加真实性,但相应烘托的数据量就大了。有人说OpenCascade的显现模块做得不是很好,上述办法则能够只运用OpenCascade的造型模块,再结合OpenSceneGraph来对图形进行显现。

三维数据交换STL格局文件中保存的都是三角面片的数据,STL文件格局是由美国3D System公司开发,已被工业界认为是现在快速主动成型范畴的准规范零件描绘文件格局。它对三维实体描绘的解说具有专一性。简直一切的几许造型体系都供给STL文件数据交换接口。OpenCascade中的数据交换模块也供给对STL格局的支撑,由此可见三角网格在几许造型体系中的重要性。

Voronoi图和Delaunay三角剖分的运用范畴非常广泛:几许建模——用来寻觅三维曲面“好的”三角剖分;有限元剖析——用来生成“好的”有限元网格;地理信息体系——用来进行空间范畴剖析;结晶学——用来确认合金的结构;人类学和考古学——用来确认氏族部落、领袖威望、寓居中心或堡垒等的影响规模;天文学——用来确认恒星和星系的散布;生物学生态学和林学——用来确认动植物的竞赛;动物学——剖析动物的领地;核算学和数据剖析——用来剖析核算聚合;机器人学——用来进行运动轨道规划(在存在障碍物的情况下);模式识别——作为寻觅物体骨架点的东西;生理学——用来剖析毛细效果的范畴;气象学——用来估量区域均匀降雨量;商场学——用来树立城市的商场辐射规模;以及在遥感图画处理、化学、地理学、地质学、冶金学、数学等学科的运用等。

本文只对OpenCascade中的三角剖分进行扼要介绍,期望对三角剖分在三维几许造型方面有爱好的朋友能够对其深入研讨。水平很有限,文中不当之处欢迎批评指正、辅导,联络邮箱:eryar@163.com

二、 Voronoi图

Dirichlet于1850年研讨了平面点的邻域问题,Voronoi于1908年将其成果扩展到高维空间。半空间界说Voronoi图:给定平面上n个点集S,S={p1, p2, …, pn}。界说:

wps_clip_image-1602

PiPj连线的垂直平分面将空间分为两半,V(Pi)表明比其他点更挨近Pi的点的轨道是n-1个半平面的交,它是一个不多于n-1条边的凸多边形域,称为关联于Pi的Voronoi多边形或关联于Pi的Voronoi域。如下图所示为关联于P1的Voronoi多边形,它是一个四边形,而n=6.

wps_clip_image-4421

Figure 2.1 n=6时的一种V(p1)

关于点集S中的每个点都能够做一个Voronoi多边形,这样的n个Voronoi多边形组成的图称为Voronoi图,记为Vor(S)。如下图所示:

wps_clip_image-31980

Figure 2.2 Voronoi diagram for 10 randomly points (Generated by MATLAB)

图中的极点和边别离称为Voronoi极点和Voronoi边。明显,|S|=n时,Vor(S)区分平面成n个多边形域,每个多边形域V(Pi)包括S中的一个点而且只包括S中的一个点,Vor(S)的边是S中某点对的垂直平分线上的一条线段或半直线,从而为该点对地点的两个多边形域所共有。Vor(S)中有的多边形域是无界的。

wps_clip_image-18135

Figure 2.3 Ten shops in a flat city and their Voronoi cells

(http://en.wikipedia.org/wiki/Voronoi_diagram)

wps_clip_image-27044

Figure 2.4 Voronoi tessellation in a cylinder (Voro++ library: http://math.lbl.gov/voro++/)

Voronoi图有如下性质:

l n个点的点集S的Voronoi图至多有2n-5个极点和3n-6条边;

l 每个Voronoi点恰好是三条Voronoi边的交点;

l 设v是Vor(S)的极点,则圆C(v)内不含S的其他点;

l 点集S中点Pi的每一个最近附近点确认V(Pi)的一条边;

l Voronoi图的直线对偶图是S的一个三角剖分;

l 假如Pi,Pj归于S,而且经过Pi,Pj有一个不包括S中其他点的圆,那么线段PiPj是点集S三角剖分的一条边,反之亦建立。

三、 Delaunay三角剖分 

1. 二维实数域上的三角剖分

假定V是二维实数域上的有限点集,边e是由点会集的点作端点构成的关闭线段,E为e的调集,那么该点集V的一个三角剖分T=(V,E)是一个平面图:

l 除了端点,平面图中的边不包括点会集的任何点;

l 没有相交边;

l 平面图中一切的面都是三角面,且一切三角面的合集是点集V的凸包。

2. Delaunay边

假定E中的一条边(两端点a,b),e满意下列条件,则称为Delaunay边:存在一个圆经过a,b两点,圆内不包括点集V中的任何的点。这一特性又称为空圆特性。

3. Delaunay三角剖分

假如点集V的一个三角剖分T中只包括Delaunay边,那么该三角剖分称为Delaunay剖分。

最近点含义下的Voronoi图的对偶图实际上是点集的一种三角剖分,该三角剖分便是Delaunay剖分(表明为DT(S)),其间每个三角形的外接圆不包括点会集的其他任何点。因而,在结构点集的Voronoi图之后,再作其对偶图,即对每条Voronoi边作经过点会集某两点的垂直平分线,即得到Delaunay三角剖分。

wps_clip_image-18943

Figure 3.1 Delaunay Triangulation (Generated by MATLAB)

再看几个图片,加深对Delaunay三角剖分的了解:

wps_clip_image-12125

Figure 3.2 Delaunay Edge 

wps_clip_image-2535

Figure 3.3 Illustrate Delaunay Edge

wps_clip_image-16525

Figure 3.4 Delaunay Edge

4. Delaunay三角剖分的特性

l 1978年Sibson证明了在二维的情况下,在点集的一切三角剖分中,Delaunay三角剖分使得生成的三角形的最小角到达最大(max-min angle)。由于这一特性,关于给定点集的Delaunay三角剖分总是尽可能防止“瘦长”三角形,主意向等边三角形迫临;

l 部分优化与全体优化(locally optimal and globally optimal);

l Delaunay空泛(cavity)与部分重连(local reconnection);

5. 经典的Delaunay三角剖分算法

现在常用的算法分为几种,有扫描线法(Sweepline)、随机增量法(Incremental)、分治法(Divide and Conquer)等。

经典的Delaunay三角剖分算法首要有两类:Bowyer/Watson算法和部分改换法。

l Bowyer/Watson算法又称为Delaunay空泛算法或加点法,以Bowyer和Watson算法为代表。从一个三角形开端,每次加一个点,确保每一步得到的当时三角形是部分优化的。以英国Bath大学数学分校Bowyer,Green,Sibson为代表的核算Dirichlet图的办法归于加点法,是较早成名的算法之一;以澳大利亚悉尼大学地学系Watson为代表的空外接球法也归于加点法。加点法算法简明,是现在运用最多的算法,该办法运用了Delaunay空泛性质。Bowyer/Watson算法的长处是与空间的维数无关,而且算法在完成上比部分改换算法简略。该算法在新点参加到Delaunay网格时,部分外接球包括新点的三角形单元不再契合Delaunay特点,则这些三角形单元被删去,构成Delaunay空泛,然后算法将新点与组成空泛的每一个极点相连生成一个新边,依据空球特点能够证明这些新边都是部分Delaunay的,因而新生成的三角网格仍是Delaunay的。

wps_clip_image-22333

Figure 3.5 Illustration of 2D Bowyer/Watson algorithm for Delaunay Triangulation

l 部分改换法又称为换边、换面法。当运用部分改换法完成增量式点集的Delaunay三角剖分时,首要定位新参加点地点的三角形,然后在网格中参加三个新的衔接该三角形极点与新极点的边,若该新点坐落某条边上,则该边被删去,四条衔接该新点的边被参加。最终,在经过换边办法对该新点的部分区域内的边进行检测和改换,从头保护网格的Delaunay性质。部分改换法的另一个长处是其能够对已存在的三角网格进行优化,使其改换成为Delaunay三角网格,该办法的缺陷则是当算法扩展到高维空间时变得较为杂乱。

四、 Delaunay三角剖分在OpenCascade的运用

OpenCascade中网格剖分的包首要有BRepMesh、MeshAlgo、MeshVS,其间,类MeshAlgo_Delaunay运用算法Watson来进行Delaunay三角剖分。从类StlTransfer中的注释The triangulation is computed with the Delaunay algorithm implemented in package BRepMesh.能够看出包BRepMesh便是Delaunay三角剖分的具体完成。运用办法如下:

BRepMesh::Mesh (aShape, Deflection);

这个函数首要是用来对拓扑形状进行三角剖分。以下经过将一个圆柱三角剖分为例阐明如何将一个拓扑形状进行三角剖分并将成果进行可视化。

 

/*

*    Copyright (c) 2013 eryar All Rights Reserved. 



*        File    : Main.cpp 

*        Author  : eryar@163.com 

*        Date    : 2013-05-26 

*        Version : 0.1 



*    Description : Use BRepMesh_Delaun class to learn  

*                  Delaunay's triangulation algorithm. 



*/
 

// Open Cascade library. 

#include 
<gp_Pnt.hxx> 

#include 
<gp_Pln.hxx> 

#include 
<BRep_Tool.hxx> 

#include 
<TopoDS.hxx> 

#include 
<TopoDS_Edge.hxx> 

#include 
<TopoDS_Wire.hxx> 

#include 
<TopoDS_Face.hxx> 

#include 
<BRepBuilderAPI_MakeEdge.hxx> 

#include 
<BRepBuilderAPI_MakeWire.hxx> 

#include 
<BRepBuilderAPI_MakeFace.hxx> 

#include 
<BRepPrimAPI_MakeBox.hxx> 

#include 
<BRepPrimAPI_MakeCone.hxx> 

#include 
<BRepPrimAPI_MakeCylinder.hxx> 

#include 
<BRepPrimApI_MakeSphere.hxx> 

#include 
<BRepMesh.hxx> 

#include 
<TopExp_Explorer.hxx> 

#include 
<Poly_Triangulation.hxx> 

#include 
<TShort_Array1OfShortReal.hxx> 

#pragma comment(lib, 
"TKernel.lib"

#pragma comment(lib, 
"TKMath.lib"

#pragma comment(lib, 
"TKBRep.lib"

#pragma comment(lib, 
"TKPrim.lib"

#pragma comment(lib, 
"TKMesh.lib"

#pragma comment(lib, 
"TKTopAlgo.lib"

// OpenSceneGraph library. 

#include 
<osgDB/ReadFile> 

#include 
<osgViewer/Viewer> 

#include 
<osgViewer/ViewerEventHandlers> 

#include 
<osgGA/StateSetManipulator> 

#pragma comment(lib, 
"osgd.lib"

#pragma comment(lib, 
"osgDbd.lib"

#pragma comment(lib, 
"osgGAd.lib"

#pragma comment(lib, 
"osgViewerd.lib"

osg::Node
* BuildShapeMesh(const TopoDS_Shape& aShape) 



    osg::ref_ptr
<osg::Group> root = new osg::Group(); 

    osg::ref_ptr
<osg::Geode> geode = new osg::Geode(); 

    osg::ref_ptr
<osg::Geometry> triGeom = new osg::Geometry(); 

    osg::ref_ptr
<osg::Vec3Array> vertices = new osg::Vec3Array(); 

    osg::ref_ptr
<osg::Vec3Array> normals = new osg::Vec3Array(); 

    BRepMesh::Mesh(aShape, 
1); 

    TopExp_Explorer faceExplorer; 

for (faceExplorer.Init(aShape, TopAbs_FACE); faceExplorer.More(); faceExplorer.Next()) 



        TopLoc_Location loc; 

        TopoDS_Face aFace 
= TopoDS::Face(faceExplorer.Current()); 

        Handle_Poly_Triangulation triFace 
= BRep_Tool::Triangulation(aFace, loc); 

        Standard_Integer nTriangles 
= triFace->NbTriangles(); 

        gp_Pnt vertex1; 

        gp_Pnt vertex2; 

        gp_Pnt vertex3; 

        Standard_Integer nVertexIndex1 
= 0

        Standard_Integer nVertexIndex2 
= 0

        Standard_Integer nVertexIndex3 
= 0

        TColgp_Array1OfPnt nodes(
1, triFace->NbNodes()); 

        Poly_Array1OfTriangle triangles(
1, triFace->NbTriangles()); 

        nodes 
= triFace->Nodes(); 

        triangles 
= triFace->Triangles(); 

for (Standard_Integer i = 1; i <= nTriangles; i++



            Poly_Triangle aTriangle 
= triangles.Value(i); 

            aTriangle.Get(nVertexIndex1, nVertexIndex2, nVertexIndex3); 

            vertex1 
= nodes.Value(nVertexIndex1); 

            vertex2 
= nodes.Value(nVertexIndex2); 

            vertex3 
= nodes.Value(nVertexIndex3); 

            gp_XYZ vector12(vertex2.XYZ() 
- vertex1.XYZ()); 

            gp_XYZ vector13(vertex3.XYZ() 
- vertex1.XYZ()); 

            gp_XYZ normal 
= vector12.Crossed(vector13); 

            Standard_Real rModulus 
= normal.Modulus(); 

if (rModulus > gp::Resolution()) 



                normal.Normalize(); 

}
 

else 



                normal.SetCoord(
0., 0., 0.); 

}
 

            vertices
->push_back(osg::Vec3(vertex1.X(), vertex1.Y(), vertex1.Z())); 

            vertices
->push_back(osg::Vec3(vertex2.X(), vertex2.Y(), vertex2.Z())); 

            vertices
->push_back(osg::Vec3(vertex3.X(), vertex3.Y(), vertex3.Z())); 

            normals
->push_back(osg::Vec3(normal.X(), normal.Y(), normal.Z())); 

}
 

}
 

    triGeom
->setVertexArray(vertices.get()); 

    triGeom
->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, vertices->size())); 

    triGeom
->setNormalArray(normals); 

    triGeom
->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE); 

    geode
->addDrawable(triGeom); 

    root
->addChild(geode); 

return root.release(); 

}
 

int main(int argc, char* argv[]) 



    osgViewer::Viewer myViewer; 

    osg::ref_ptr
<osg::Group> root = new osg::Group(); 

    root
->addChild(BuildShapeMesh(BRepPrimAPI_MakeCylinder(.61))); 

    myViewer.setSceneData(root); 

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

    myViewer.addEventHandler(
new osgViewer::StatsHandler); 

    myViewer.addEventHandler(
new osgViewer::WindowSizeHandler); 

return myViewer.run(); 

}
 


成果如下图所示:

wps_clip_image-31478

Figure 4.1 Cylinder mesh generated by BRepMesh::Mesh

BRepMesh::Mesh是经过封装的,便于对拓扑形状进行三角剖分。以下经过一个简略的比如来阐明直接运用BRepMesh_Delaun的办法:

 

/*

*    Copyright (c) 2013 eryar All Rights Reserved. 



*        File    : Main.cpp 

*        Author  : eryar@163.com 

*        Date    : 2013-05-26 

*        Version : 0.1 



*    Description : Use BRepMesh_Delaun class to learn  

*                  Delaunay's triangulation algorithm. 



*/ 

#include 
<BRepMesh_Edge.hxx> 

#include 
<BRepMesh_Delaun.hxx> 

#include 
<BRepMesh_Array1OfVertexOfDelaun.hxx> 

#include 
<TColStd_MapIteratorOfMapOfInteger.hxx> 

#pragma comment(lib, 
"TKernel.lib"

#pragma comment(lib, 
"TKMesh.lib"

int main(int argc, char* argv[]) 



    BRepMesh_Array1OfVertexOfDelaun vertices(
14); 

    vertices.SetValue(
1, BRepMesh_Vertex(00, MeshDS_Free)); 

    vertices.SetValue(
2, BRepMesh_Vertex(10, MeshDS_Free)); 

    vertices.SetValue(
3, BRepMesh_Vertex(11, MeshDS_Free)); 

    vertices.SetValue(
4, BRepMesh_Vertex(01, MeshDS_Free)); 

    BRepMesh_Delaun triangulation(vertices); 

//triangulation.AddVertex(BRepMesh_Vertex(0.5, 0.5, MeshDS_OnSurface)); 

    Handle_BRepMesh_DataStructureOfDelaun meshData 
= triangulation.Result(); 

    std::cout
<<"Iterate Mesh Triangles:"<<std::endl; 

    MeshDS_MapOfInteger::Iterator triDom; 

for (triDom.Initialize(meshData->ElemOfDomain()); triDom.More(); triDom.Next()) 



        Standard_Integer triId 
= triDom.Key(); 

const BRepMesh_Triangle& curTri = meshData->GetElement(triId); 

        Standard_Integer vertexIndex1 
= 0

        Standard_Integer vertexIndex2 
= 0

        Standard_Integer vertexIndex3 
= 0

        Standard_Integer edgeIndex1 
= 0

        Standard_Integer edgeIndex2 
= 0

        Standard_Integer edgeIndex3 
= 0

        Standard_Boolean o1 
= Standard_False; 

        Standard_Boolean o2 
= Standard_False; 

        Standard_Boolean o3 
= Standard_False; 

        curTri.Edges(edgeIndex1, edgeIndex2, edgeIndex3, o1, o2, o3); 

const BRepMesh_Edge& edge1 = meshData->GetLink(edgeIndex1); 

const BRepMesh_Edge& edge2 = meshData->GetLink(edgeIndex2); 

const BRepMesh_Edge& edge3 = meshData->GetLink(edgeIndex3); 

        vertexIndex1 
= (o1? edge1.FirstNode(): edge1.LastNode()); 

        vertexIndex2 
= (o1? edge1.LastNode() : edge1.FirstNode()); 

        vertexIndex3 
= (o2? edge2.LastNode() : edge2.FirstNode()); 

const BRepMesh_Vertex& vertex1 = meshData->GetNode(vertexIndex1); 

const BRepMesh_Vertex& vertex2 = meshData->GetNode(vertexIndex2); 

const BRepMesh_Vertex& vertex3 = meshData->GetNode(vertexIndex3); 

const gp_XY& p1 = vertex1.Coord(); 

const gp_XY& p2 = vertex2.Coord(); 

const gp_XY& p3 = vertex3.Coord(); 

        std::cout
<<"--------"<<std::endl; 

        std::cout
<<p1.X()<<" , "<<p1.Y()<<std::endl; 

        std::cout
<<p2.X()<<" , "<<p2.Y()<<std::endl; 

        std::cout
<<p3.X()<<" , "<<p3.Y()<<std::endl; 

        std::cout
<<"========"<<std::endl; 



return 0




上述程序是以一个正方形为例,运用BRepMesh_Delaun三角剖分的成果为两个三角形,如下所示:

 

Iterate Mesh Triangles: 

-------- 

1 , 1 

0 , 0 

1 , 0 

======== 

-------- 

1 , 1 

0 , 1 

0 , 0 

======== 

 

以上成果都是二维空间上的,三维空间中的运用办法能够参阅类:BRepMesh_FastDiscretFace。这个类阐明了如何将一个面进行网格区分。

五、 定论

Delaunay三角剖分理论在三维几许造型中仍是比较重要的,经过对形状的三角剖分,不只能够对其进行可视化,还便于对形状做进一步的处理,如消隐、光照处理等。经过对OpenCascade中三角剖分算法的运用,以进一步了解三角剖分理论运用及其算法完成。

六、 参阅资料

1. 周培德. 核算几许—算法规划与剖析. 清华大学出版社, 2011

2. 李海生. Delaunay三角剖分理论及可视化运用研讨. 哈尔滨工业大学出版社, 2010

3. 何援军. 核算机图形学. 机械工业出版社, 2010

4. 周元峰, 孙峰, 王文平, 汪嘉业, 张彩明. 根据部分修正的移动数据点Delaunay三角化快速更新办法. 核算机辅助规划与图形学学报, 2011, 12: 2006-1012

5. http://en.wikipedia.org/wiki/Voronoi_diagram

 

Feedback

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-03-13 19:18 by OpenCASCADE->3D
称号您一声E教师,一点都不为过。路漫漫其修远兮,吾将上下而求索!

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-03-13 19:52 by eryar
@OpenCASCADE->3D
教师实不敢当。

后半句共勉之……

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-24 11:08 by 佚名
博主很厉害,怎样对occ研讨这么透。假如occ能在国内遍及。博主功不可没!另讨教博主一个问题,如何将一组散点组成nurbs曲面,假定这些点是从已有曲面上得到的,不只仅包括鸿沟线上的点,还有面内部点。

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-24 17:49 by eryar
@佚名
过奖了。

我看OCC的比如程序中有个依据点生成面的功用,运用的类有:
1. Plate_Plate;
2. GeomPlate_Surface;
3. GeomPlate_MakeApprox;

相关完成能够参阅示例程序。

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-24 22:10 by 佚名
@eryar
谢谢您的回复,我好好看看这些算例。

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-24 22:33 by eryar
@佚名
不客气。。。

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-25 17:22 by 佚名
博主您好!
按您的点拨我看了occ顺便的比如11,它确实能够由离散点组成样条曲面,美中不足的是曲面的一部分延伸出了鸿沟线(由离散的外围点组成),试着经过调整参数将面约束在点的规模内,但是毫无效果. 是否有更好的办法,假如我先将这些点连成delaunay三角面,能否由这些面组成样条曲面?谢谢!


# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-25 17:39 by eryar
@佚名

你好!

拟合曲面的算法还没有细看。

不过如同OCC有收费的模块,专门用来从点云数据生成几许数据,能够看看:
Surfaces from Scattered Points:
http://www.opencascade.org/support/products/ssp/

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-09-25 19:49 by 佚名
非常感谢

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-11-25 10:52 by xmzzy
讨教个问题:
在运用BRepMesh::Mesh (aShape, Deflection);时,编译提示“Mesh”: 不是“BRepMesh”的成员。
这个怎样处理呢?

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-11-25 12:43 by 明升
@xmzzy
你可能用的occ6.8.0,这个版别中去掉BRepMesh::Mesh()函数了,官方给的答复是这个函数仅仅调用了BRepMesh_IncrementalMesh来生成网格,没有存在的含义,所以予以去除。
具体可参阅官方论坛:
http://www.opencascade.org/org/forum/thread_26649/?forum=3

6.8.0: BRepMesh::Mesh removed
去除原因及新的用法都有提及,原文如下:
Forum supervisor 2014/11/13 17:30
Dear Thorsen,

Method BRepMesh::Mesh did nothing more than called BRepMesh_IncrementalMesh with the given parameter, so it had no significant meaning and as result it was removed.
To perform meshing user should use BRepMesh_IncrementalMesh directly, for instance:

#include<BRepMesh_IncrementalMesh.hxx>
...
BRepMesh_IncrementalMesh(aShape, 0.001);
...

It is exactly the same what BRepMesh::Mesh did.

Best regards
FSR

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-11-25 13:29 by xmzzy
@eryar
非常感谢。大神啊。

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-12-11 11:26 by zhx
您好,楼主!我想完成对点集的DELAUNAY三角剖分,点集在三维空间的一个平面上(该平面时恣意方位的平面),点能够获取为gp_pnt类型,请问能不能用BRepMesh_Delaun完成对该点集的剖分呢?
别的,请问下BRepMesh_Array1OfVertexOfDelaun类型的赋值怎样由GP_PNT类的值完成呢 非常感谢楼主!

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-12-11 14:52 by zhx
@xmzzy
你好啊 我也是在用OCC,之前用的是OCC6.5.0,现在想换位OCC6.8.0,但是装置完之后发现6.8.0版别的网页版的OCC文档不能查找函数,是为什么呢?

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-12-11 17:33 by eryar
@zhx
Hi,

你好!

OpenCASCADE的mesh算法仅仅针对二维的点集(即参数空间中的点),首要是为了替换掉6.3版别曾经用的Triangle库。

假如你是三维的点且可确认都在一个平面上,能够考虑将这些点投影到这个平面,Delaunay三角剖分后再映射回三维空间。

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2014-12-15 22:25 by eryar
@zhx
你好啊 我也是在用OCC,之前用的是OCC6.5.0,现在想换位OCC6.8.0,但是装置完之后发现6.8.0版别的网页版的OCC文档不能查找函数,是为什么呢?
=================================================

我也试了下,occ6.8.0开发文档中的search功用确实不能用。
看了下,它是用php来调用javascript的,所以应该需求放到支撑php的服务器上运转这个文档就能够查找了。

我在occ官网上search是能够的,如下为在occ官网上search类gp_Pnt:
http://dev.opencascade.org/doc/refman/html/search.php?query=gp_Pnt

# re: OpenCascade中的Delaunay三角剖分  回复  更多谈论   

2016-03-12 14:33 by loveabcc
@佚名
你好:不知道你能收到我的回复不,我想完成的是和你是相同的东西,便是点云转换成Nurbs,你说的OCC比如11是哪个呢,还有现在你找到OCC的办法了吗,假如能够共享下。谢谢兄弟