绘制OpenCascade中的曲线

Similar documents
OpenCascade中网格的数据结构

STL of Open Cascade Data Exchange

01-场景节点.doc

¬¬






C++ 程式設計

<30312E20B9EFB7C5AF66BEC7A4A4A175A5CDAC7ABE69B3B1A176AABABDD7AA522E706466>

3. 企 业 债 券 : 公 司 债 券 : 5. 证 券 公 司 债 券 : 6. 企 业 短 期 融 资 券 : 7. 中 期 票 据 : 8. 资 产 支 持 证 券 : 9. 国 际 开 发 机 构 人 民 币 债 券 : 10. 中 小 非 金 融 企 业 集 合 票 据 例 题? 判 断

Delaunay Triangulation in OpenCascade


優質居所 攜手共建

<BBB6D3ADB7C3CECABFC6D1A7CEC4BBAFC6C0C2DB>

Topology and Geometry in OpenCascade

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

mvc

¬¬

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Topology and Geometry in OpenCascade

2002 Shintoukai Chinese Academy. All rights reserved 2

試卷一

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

<33352E20C0B3A5CEB2D5BEC7A7DEB34EB5FBBBF9A4A4C3C4B5C7AC72A9CAAABAACE3A873B669AE692E706466>

陳偉補習班環境介紹

untitled

B

中国人民大学公共管理大专业考研必读信息(公共管理学院部分)

三、育明考博总结中共中央党校考博复习策略(育明教育考博课程中心)

<32372E20B077A8EBABE1B7CBA5DEA4A3A650B260ABD7B9EFAA76C0F8AFABB867AEDAABACC056B4D5AF66AABAC0F8AEC4B1B4AFC12E706466>

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016


China Academic Journal Electronic Publishing House. All rights reserved.

China Academic Journal Electronic Publishing House. All rights reserved.


幻灯片 1


封面及首頁.doc


OpenCascade BRep Format Description

Microsoft Word - 12 hhg doc

Microsoft Word - HHG 10 Page 001.doc

封面.PDF

Topology and Geometry in OpenCascade


BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2


Java

ebook111-4

黃 花 崗 讀 者 子 日 先 生 在 大 陸 遙 祝 雜 誌 同 仁 中 秋 好! 參 加 過 八 年 抗 戰 的 國 民 革 命 軍 前 中 將 羅 澄 先 生 告 訴 黃 花 崗 雜 誌 主 編 說 : 你 們 做 的 就 是 在 歷 史 和 文 化 上 正 本 清 源 繼 往 開 來 的 大

第3章.doc


一 土 地 市 场 1 土 地 供 应 2016 年 第 19 周 (2016 年 5 月 2 日 2016 年 5 月 8 日 ), 北 京 供 应 土 地 0 宗 2016 年 第 19 周 北 京 房 地 产 市 场 土 地 供 应 一 览 表 地 块 面 积 宗 地 号 / 名 称 交 易


nan_yang_ming_ren_ji_zhuan.xls

开 发 领 导 小 组 2016 年 3 月 16 日 发 布 实 8 水 利 部 办 公 厅 中 国 农 业 发 展 银 行 办 公 室 关 于 做 好 抵 押 补 充 贷 款 项 目 库 管 理 工 作 的 通 知 ( 水 利 部 中 国 农 业 发 展 银 行 2016 年 3 月 23 日

Microsoft Word - HHG 14 Page 001.doc

chap-1_NEW.PDF

在挑选合适的 SDK 的时候需要注意, 标准 windows 平台应用选择 FBX SDK VS2015,windows 应用商店和全平台通用的不用考虑 windows 全平台通用的应用是 windows10 新推出的功能, 可以打通 windows phone windows s


Microsoft Word - Page doc

C 1

untitled

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Two analytical 2d line intersection in OpenCASCADE Abstract. OpenCASCADE geometric tools provide algorithms to calculate the intersectio

Strings

Strings

The golden pins of the PCI card can be oxidized after months or years

新 法 评 述 1 关 于 移 动 游 戏 出 版 服 务 管 理 的 通 知 评 述 ( 作 者 : 陈 容 张 艳 冰 ) 2016 年 6 月 2 日, 国 家 新 闻 出 版 广 播 电 影 电 视 总 局 ( 以 下 简 称 广 电 总 局 ) 发 布 关 于 移 动 游 戏 出 版 服

第7章-并行计算.ppt

目 次 第七期

省政协委员陈志实:知识产权市场化须以法治方式推:大奖娱乐官方网站 进

精 神 與 自 然 : 楊 慈 湖 心 學 研 究 趙 燦 鵬 哲 學 博 士 嶺 南 大 學 二 零 零 五 年

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

<4D F736F F D20BABAC0A4D7A8B5DD20B5DA3635C6DAA3A C4EAB5DA37C6DAA3A9A3A8D6D0CEC4A3A9>

OpenCASCADE Root-Finding Algorithm

B-Spline Curve Library in Open Cascade


Visualization of Generic Surface

Process Data flow Data store External entity 6-10 Context diagram Level 0 diagram Level 1 diagram Level 2 diagram

Microsoft Word - CVersion doc

17 Prelight Apply Color Paint Vertex Color Tool Prelight Apply Color Paint Vertex Color Tool 242 Apply Color, Prelight Maya Shading Smooth

目 录 1. 概 述 导 航 模 块 主 页 发 现 分 享 消 息 我 核 心 功 能 注 册 / 登 录 注 册... 10

0404.doc

“PC通”商业计划书.doc

目 录 欢 迎 使 用 产 品 介 绍 产 品 概 述 产 品 特 点 代 理 商 系 统 使 用 说 明 登 陆 基 本 信 息 分 销 商 管 理 帐 户

江苏省海安职业教育中心

Move Component Object selection Component selection UV Maya Hotkeys editor Maya USING MAYA POLYGONAL MODELING 55

,, [8 ] (p. 666),, [8 ] (p. 544), (1643 ), 30,,,,,,,,,,,,,,,,,,,,,,,, [9 ] (),, [8 ] (p. 306),,, [8 ] (p. 1052),, [8 ] (p. 1070),,,,, (1640 ),, [10 ]

C6_ppt.PDF

cover01.doc

untitled

Microsoft Photo Editor - Cover 1.jpg

晶体结构立体模型建构软件-Diamond的使用

1 目 的 为 维 护 国 内 政 企 市 场 良 好 的 市 场 秩 序, 加 强 对 窜 货 等 重 大 违 规 行 为 的 管 理, 特 在 2016 年 中 兴 通 讯 国 内 政 企 市 场 窜 货 管 理 办 法 基 础 上 制 定 本 管 理 办 法 本 管 理 办 法 适 用 于 中


DAGONG PRESS REVIEW world.people.com.cn

Transcription:

在 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, 类图如下所示 : Figure 1.1 Geometry curve class diagram 抽象基类 Geom_Curve 有几个纯虚函数 FirstParameter() LastParameter() Value(), 根据这几个虚函数, 就可以计算曲线上对应参数 U 的值 类图如下图所示 :

Geom_Circle Geom_BezierCurve Geom_Ellipse Geom_Curve +Standard_Real FirstParameter() +Standard_Real LastParameter() +gp_pnt Value(const Standard_Real U) Geom_BSplineCurve Geom_Hyperbola Geom_TrimmedCurve Geom_Parabola Geom_Line Figure 1.2 Geom_Curve Inherited class diagram 每种曲线都对那些纯虚函数进行实现, 使计算曲线上点的方式统一

二 程序示例 Code Example 根据抽象基类 Geom_Curve 的几个纯虚函数 : 1.FirstParameter(); 2.LastParameter(); 3.Value(u); 利用多态可将曲线上点都以统一的方式计算出来, 并使用 GL_LINE_STRIP 绘制出来 示例程序如下所示 : /* * Copyright (c) 2013 eryar All Rights Reserved. * * File : Main.cpp * Author : eryar@163.com * Date : 2013-08-09 18:09 * Version : 1.0v * * Description : Draw OpenCascade Geometry Curves in OpenSceneGraph. * */ // 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") // OpenCascade library. #include <TColgp_Array1OfPnt.hxx> #include <TColStd_Array1OfReal.hxx> #include <TColStd_Array1OfInteger.hxx> #include <Geom_Circle.hxx> #include <Geom_Ellipse.hxx> #include <Geom_Hyperbola.hxx> #include <Geom_Parabola.hxx> #include <Geom_BezierCurve.hxx> #include <Geom_BSplineCurve.hxx> #pragma comment(lib, "TKernel.lib") #pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKG3d.lib") // Curve Segment Delta. const double CURVE_SEGMENT_DELTA = 0.01; /*

* @brief Build geometry curve of OpenCascade. */ osg::node* buildcurve(const Geom_Curve& curve) osg::ref_ptr<osg::geode> geode = new osg::geode(); osg::ref_ptr<osg::geometry> linesgeom = new osg::geometry(); osg::ref_ptr<osg::vec3array> pointsvec = new osg::vec3array(); gp_pnt point; double dfirst = curve.firstparameter(); double dlast = curve.lastparameter(); Precision::IsNegativeInfinite(dFirst)? dfirst = -1.0 : dfirst; Precision::IsInfinite(dLast)? dlast = 1.0 : dlast; for (double u = dfirst; u <= dlast; u += CURVE_SEGMENT_DELTA) point = curve.value(u); } pointsvec->push_back(osg::vec3(point.x(), point.y(), point.z())); // Set the colors. osg::ref_ptr<osg::vec4array> colors = new osg::vec4array; colors->push_back(osg::vec4(1.0f, 1.0f, 0.0f, 0.0f)); linesgeom->setcolorarray(colors.get()); linesgeom->setcolorbinding(osg::geometry::bind_overall); // Set the normal in the same way of color. osg::ref_ptr<osg::vec3array> normals = new osg::vec3array; normals->push_back(osg::vec3(0.0f, -1.0f, 0.0f)); linesgeom->setnormalarray(normals.get()); linesgeom->setnormalbinding(osg::geometry::bind_overall); // Set vertex array. linesgeom->setvertexarray(pointsvec); linesgeom->addprimitiveset(new osg::drawarrays(osg::primitiveset::line_strip, 0, pointsvec->size())); geode->adddrawable(linesgeom.get()); } return geode.release(); /** * @breif Build geometry curve of OpenCascade. */ osg::node* buildscene() osg::ref_ptr<osg::group> root = new osg::group();

// 1. Build circle curve. Geom_Circle circle(gp::yoz(), 1.0); root->addchild(buildcurve(circle)); // 2. Build ellipse curve. Geom_Ellipse ellipse(gp::zox(), 1.0, 0.3); root->addchild(buildcurve(ellipse)); // 3. Build Hyperbola curve. Geom_Hyperbola hyperbola(gp::xoy(), 1.0, 0.6); root->addchild(buildcurve(hyperbola)); // 4. Build parabola curve. Geom_Parabola parabola(gp::zox(), 1.0); root->addchild(buildcurve(parabola)); // 5. Build Bezier curve. TColgp_Array1OfPnt poles(1, 4); poles.setvalue(1, gp_pnt(-1, -1, 0)); poles.setvalue(2, gp_pnt(1, 2, 0)); poles.setvalue(3, gp_pnt(3, 0, 0)); poles.setvalue(4, gp_pnt(4, 1, 0)); Geom_BezierCurve beziercurve(poles); root->addchild(buildcurve(beziercurve)); // 6. Build BSpline curve. TColgp_Array1OfPnt ctrlpnts(1, 3); TColStd_Array1OfReal knots(1, 5); TColStd_Array1OfInteger mults(1, 5); ctrlpnts.setvalue(1, gp_pnt(0, 1, 0)); ctrlpnts.setvalue(2, gp_pnt(1, -2, 0)); ctrlpnts.setvalue(3, gp_pnt(2, 3, 0)); knots.setvalue(1, 0.0); knots.setvalue(2, 0.25); knots.setvalue(3, 0.5); knots.setvalue(4, 0.75); knots.setvalue(5, 1.0); mults.init(1); Geom_BSplineCurve bsplinecurve(ctrlpnts, knots, mults, 1); root->addchild(buildcurve(bsplinecurve));

} return root.release(); int main(int argc, char* argv[]) osgviewer::viewer myviewer; myviewer.setscenedata(buildscene()); myviewer.addeventhandler(new osgga::statesetmanipulator(myviewer.getcamera()->getorcreatestateset())); myviewer.addeventhandler(new osgviewer::statshandler); myviewer.addeventhandler(new osgviewer::windowsizehandler); } return myviewer.run(); 因抛物线和双曲线的 FirstParameter() 和 LastParameter() 为负无穷和正无穷, 所以对其进行处理, 只输出了部分曲线 程序效果如下图所示 : Figure 2.1 OpenCascade Geometry Curves in OpenSceneGraph

三 结论 Conclusion OpenCascade 的几何数据使用还是很方便的, 只要将相应的曲线构造出来之后, 计算曲线上的点使用函数 Value() 即可, 还可计算相应参数处的微分值等 通过理解 BRep Format Description White Paper, 可将 BRep 文件中数据导入 OpenCascade 中与上面实现的程序进行对比, 结果正确 如下图所示 : Figure 3.1 B-Spline in OpenSceneGraph Figure 3.2 B-Spline in OpenCascade Draw