在OpenSceneGraph中绘制OpenCascade的曲线

简介: 在OpenSceneGraph中绘制OpenCascade的曲线 Draw OpenCascade Geometry Curves in OpenSceneGraph eryar@163.com 摘要Abstract:本文简要说明OpenCascade中几何曲线的数据,并将这些几何曲线在OpenSceneGraph中绘制出来。

在OpenSceneGraph中绘制OpenCascade的曲线

Draw OpenCascade Geometry Curves in OpenSceneGraph

eryar@163.com

摘要Abstract:本文简要说明OpenCascade中几何曲线的数据,并将这些几何曲线在OpenSceneGraph中绘制出来。

关键字KeyWords:OpenCascade、Geometry Curve、OpenSceneGraph、B-Spline、NURBS

一、引言 Introduction

结合《BRep Format Description White Paper》对OpenCascade中的几何数据结构有详细的介绍。OpenCascade中BRep格式中的曲线总共分为九种,不过有二维三维之分:

1.直线 Line

2.圆 Circle

3.椭圆 Ellipse

4.抛物线 Parabola

5.双曲线 Hyperbola

6.Bezier曲线 Bezier Curve

7.B-Spline曲线 B-Spline Curve

8.裁剪曲线 Trimmed Curve

9.偏移曲线 Offset Curve

曲线的几何数据都有一个抽象基类Geom_Curve,类图如下所示:

wps_clip_image-32738

Figure 1.1 Geometry curve class diagram

抽象基类Geom_Curve有几个纯虚函数FirstParameter()、LastParameter()、Value(),根据这几个虚函数,就可以计算曲线上对应参数U的值。类图如下图所示:

wps_clip_image-32037

Figure 1.2 Geom_Curve Inherited class diagram

每种曲线都对那些纯虚函数进行实现,使计算曲线上点的方式统一。

二、程序示例 Code Example

根据抽象基类Geom_Curve的几个纯虚函数:

1.FirstParameter();

2.LastParameter();

3.Value(u);

利用多态可将曲线上点都以统一的方式计算出来,并使用GL_LINE_STRIP绘制出来。示例程序如下所示:

  1  /*
  2  *    Copyright (c) 2013 eryar All Rights Reserved.
  3  *
  4  *        File    : Main.cpp
  5  *        Author  : eryar@163.com
  6  *        Date    : 2013-08-09 18:09
  7  *        Version : 1.0v
  8  *
  9  *    Description : Draw OpenCascade Geometry Curves in OpenSceneGraph.
 10  *                  
 11  */
 12 
 13  //  OpenSceneGraph library.
 14  #include  < osgDB / ReadFile >
 15  #include  < osgViewer / Viewer >
 16  #include  < osgViewer / ViewerEventHandlers >
 17  #include  < osgGA / StateSetManipulator >
 18 
 19  #pragma comment(lib,  " osgd.lib " )
 20  #pragma comment(lib,  " osgDbd.lib " )
 21  #pragma comment(lib,  " osgGAd.lib " )
 22  #pragma comment(lib,  " osgViewerd.lib " )
 23 
 24  //  OpenCascade library.
 25  #include  < TColgp_Array1OfPnt.hxx >
 26  #include  < TColStd_Array1OfReal.hxx >
 27  #include  < TColStd_Array1OfInteger.hxx >
 28 
 29  #include  < Geom_Circle.hxx >
 30  #include  < Geom_Ellipse.hxx >
 31  #include  < Geom_Hyperbola.hxx >
 32  #include  < Geom_Parabola.hxx >
 33  #include  < Geom_BezierCurve.hxx >
 34  #include  < Geom_BSplineCurve.hxx >
 35 
 36  #pragma comment(lib,  " TKernel.lib " )
 37  #pragma comment(lib,  " TKMath.lib " )
 38  #pragma comment(lib,  " TKG3d.lib " )
 39 
 40  //  Curve Segment Delta.
 41  const   double  CURVE_SEGMENT_DELTA  =   0.01 ;
 42 
 43  /*
 44  * @brief Build geometry curve of OpenCascade.
 45  */
 46  osg::Node *  buildCurve( const  Geom_Curve &  curve)
 47  {
 48      osg::ref_ptr < osg::Geode >  geode  =   new  osg::Geode();
 49      osg::ref_ptr < osg::Geometry >  linesGeom  =   new  osg::Geometry();
 50      osg::ref_ptr < osg::Vec3Array >  pointsVec  =   new  osg::Vec3Array();
 51 
 52      gp_Pnt point;
 53       double  dFirst  =  curve.FirstParameter();
 54       double  dLast  =  curve.LastParameter();
 55 
 56      Precision::IsNegativeInfinite(dFirst)  ?  dFirst  =   - 1.0  : dFirst;
 57      Precision::IsInfinite(dLast)  ?  dLast  =   1.0  : dLast;
 58      
 59       for  ( double  u  =  dFirst; u  <=  dLast; u  +=  CURVE_SEGMENT_DELTA)
 60      {
 61          point  =  curve.Value(u);
 62 
 63          pointsVec -> push_back(osg::Vec3(point.X(), point.Y(), point.Z()));
 64      }
 65 
 66       //  Set the colors.
 67      osg::ref_ptr < osg::Vec4Array >  colors  =   new  osg::Vec4Array;
 68      colors -> push_back(osg::Vec4( 1.0f 1.0f 0.0f 0.0f ));
 69      linesGeom -> setColorArray(colors. get ());
 70      linesGeom -> setColorBinding(osg::Geometry::BIND_OVERALL);
 71 
 72       //  Set the normal in the same way of color.
 73      osg::ref_ptr < osg::Vec3Array >  normals  =   new  osg::Vec3Array;
 74      normals -> push_back(osg::Vec3( 0.0f - 1.0f 0.0f ));
 75      linesGeom -> setNormalArray(normals. get ());
 76      linesGeom -> setNormalBinding(osg::Geometry::BIND_OVERALL);
 77 
 78       //  Set vertex array.
 79      linesGeom -> setVertexArray(pointsVec);
 80      linesGeom -> addPrimitiveSet( new  osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP,  0 , pointsVec -> size()));
 81      
 82      geode -> addDrawable(linesGeom. get ());
 83 
 84       return  geode.release();
 85  }
 86 
 87  /* *
 88  * @breif Build geometry curve of OpenCascade.
 89  */
 90  osg::Node *  buildScene()
 91  {
 92      osg::ref_ptr < osg::Group >  root  =   new  osg::Group();
 93 
 94       //  1. Build circle curve.
 95      Geom_Circle circle(gp::YOZ(),  1.0 );
 96 
 97      root -> addChild(buildCurve(circle));
 98 
 99       //  2. Build ellipse curve.
100      Geom_Ellipse ellipse(gp::ZOX(),  1.0 0.3 );
101 
102      root -> addChild(buildCurve(ellipse));
103 
104       //  3. Build Hyperbola curve.
105      Geom_Hyperbola hyperbola(gp::XOY(),  1.0 0.6 );
106 
107      root -> addChild(buildCurve(hyperbola));
108 
109       //  4. Build parabola curve.
110      Geom_Parabola parabola(gp::ZOX(),  1.0 );
111 
112      root -> addChild(buildCurve(parabola));
113 
114       //  5. Build Bezier curve.
115      TColgp_Array1OfPnt poles( 1 4 );
116      poles.SetValue( 1 , gp_Pnt( - 1 - 1 0 ));
117      poles.SetValue( 2 , gp_Pnt( 1 2 0 ));
118      poles.SetValue( 3 , gp_Pnt( 3 0 0 ));
119      poles.SetValue( 4 , gp_Pnt( 4 1 0 ));
120      Geom_BezierCurve bezierCurve(poles);
121 
122      root -> addChild(buildCurve(bezierCurve));
123 
124       //  6. Build BSpline curve.
125      TColgp_Array1OfPnt ctrlPnts( 1 3 );
126      TColStd_Array1OfReal knots( 1 5 );
127      TColStd_Array1OfInteger mults( 1 5 );
128      
129      ctrlPnts.SetValue( 1 , gp_Pnt( 0 1 0 ));
130      ctrlPnts.SetValue( 2 , gp_Pnt( 1 - 2 0 ));
131      ctrlPnts.SetValue( 3 , gp_Pnt( 2 3 0 ));
132 
133      knots.SetValue( 1 0.0 );
134      knots.SetValue( 2 0.25 );
135      knots.SetValue( 3 0.5 );
136      knots.SetValue( 4 0.75 );
137      knots.SetValue( 5 1.0 );
138 
139      mults.Init( 1 );
140 
141      Geom_BSplineCurve bsplineCurve(ctrlPnts, knots, mults,  1 );
142 
143      root -> addChild(buildCurve(bsplineCurve));
144 
145       return  root.release();
146  }
147 
148  int  main( int  argc,  char *  argv[])
149  {
150      osgViewer::Viewer myViewer;
151 
152      myViewer.setSceneData(buildScene());
153 
154      myViewer.addEventHandler( new  osgGA::StateSetManipulator(myViewer.getCamera() -> getOrCreateStateSet()));
155      myViewer.addEventHandler( new  osgViewer::StatsHandler);
156      myViewer.addEventHandler( new  osgViewer::WindowSizeHandler);
157 
158       return  myViewer.run();
159  }

因抛物线和双曲线的FirstParameter()和LastParameter()为负无穷和正无穷,所以对其进行处理,只输出了部分曲线。

程序效果如下图所示:

wps_clip_image-7357

Figure 2.1 OpenCascade Geometry Curves in OpenSceneGraph

三、结论 Conclusion

OpenCascade的几何数据使用还是很方便的,只要将相应的曲线构造出来之后,计算曲线上的点使用函数Value()即可,还可计算相应参数处的微分值等。

通过理解《BRep Format Description White Paper》,可将BRep文件中数据导入OpenCascade中与上面实现的程序进行对比,结果正确。如下图所示:

wps_clip_image-13312

Figure 3.1 B-Spline in OpenSceneGraph

wps_clip_image-6019

Figure 3.2 B-Spline in OpenCascade Draw

 

目录
相关文章
|
1月前
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
48 0
|
7月前
|
图形学
浅谈Unity之ShaderGraph-等高线和高程渐变设色
ShaderGraph实现等高线和高程渐变设色
|
数据可视化 搜索推荐 数据挖掘
使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)(中)
使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)(中)
502 0
使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)(中)
|
4月前
【QCustomPlot库绘制曲线应用】
【QCustomPlot库绘制曲线应用】
53 0
|
10月前
|
数据可视化 数据挖掘 数据处理
ComplexHeatmap|绘制单个热图-I
ComplexHeatmap|绘制单个热图-I
144 0
|
11月前
|
数据可视化 数据挖掘 Python
跟着Nature学作图:R语言ggplot2三角热图按照指定的角度旋转
跟着Nature学作图:R语言ggplot2三角热图按照指定的角度旋转
|
11月前
|
数据可视化 数据挖掘 Python
跟着Nature Metabolism学作图:R语言ggplot2柱形图和下三角热图完整示例
跟着Nature Metabolism学作图:R语言ggplot2柱形图和下三角热图完整示例
|
图形学
Unity利用正态分布绘制噪点图
Unity利用正态分布绘制噪点图
200 0
Unity利用正态分布绘制噪点图
|
数据可视化
使用ComplexHeatmap绘制复杂热图|Note1:简介
复杂的热图可以有效地可视化不同数据源之间的关联,并揭示潜在的模式。ComplexHeatmap包提供了一种高度灵活的方式来安排多个热图,并支持自定义的注释图形。
251 0
|
数据可视化 数据挖掘
使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)(上)
使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)(上)
702 0
使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)(上)