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

eryar

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

Representation Data in OpenCascade BRep

Posted on 2013-12-14 18:40 eryar 閱讀(3148) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Representation Data in OpenCascade BRep

eryar@163.com

摘要Abstract:現(xiàn)在的顯示器大多數(shù)是光柵顯示器,即可以看做一個(gè)像素的矩陣。在光柵顯示器上顯示的任何圖形,實(shí)際上都是一些具有一種或多種顏色的集合。數(shù)學(xué)上精確表示的圖形在顯示器中只能用逼近的方式顯示出來(lái)。本文主要對(duì)OpenCascade的BRep文件中用來(lái)顯示曲線和曲面的離散數(shù)據(jù)結(jié)構(gòu)進(jìn)行說(shuō)明。

關(guān)鍵字:OpenCascade, BRep, Polygon, Triangulation, Subdivision Curves,

一、引言 Introduction

光柵圖形顯示器可以看做一個(gè)像素矩陣。在光柵顯示器上顯示的任何一種圖形,實(shí)際上都是一些具有一種或多種顏色的像素的集合。在數(shù)學(xué)上,理想的曲線是沒(méi)有寬度的,它是由無(wú)數(shù)個(gè)點(diǎn)構(gòu)成的集合,而當(dāng)要顯示曲線時(shí),就不能用無(wú)數(shù)個(gè)點(diǎn)在顯示器中顯示,必須對(duì)其進(jìn)行離散化,即細(xì)分處理。考慮性能要求,需要用盡可能少的點(diǎn)來(lái)顯示曲線。對(duì)于曲面也是一樣,雖然已經(jīng)有曲面的數(shù)學(xué)解析表示,但是需要在顯示器中顯示時(shí),必須對(duì)其離散化,即三角剖分得到的逼近曲面的三角網(wǎng)格。

在OpenCascade中已經(jīng)有曲線和曲面的精確的數(shù)學(xué)解析表達(dá)形式的類,如下圖所示:

wps_clip_image-26135

Figure 1.1 Parametric geometry curves

wps_clip_image-30917

Figure 1.2 Parametric geometry surfaces

在OpenGL中顯示這些曲線和曲面時(shí),不能直接顯示出由參數(shù)方程精確表示的曲線和曲面,必須對(duì)曲線和曲面進(jìn)行細(xì)分,即離散化,得到OpenGL顯示用的點(diǎn)和三角網(wǎng)格。

在OpenCascade中使用類Poly_Polygon3D/Poly_Polygon2D來(lái)保存多段線的數(shù)據(jù),即可以用來(lái)保存逼近顯示由參數(shù)方程精確表示的曲線的離散點(diǎn)數(shù)據(jù)。

在OpenCascade中使用類Poly_Triangulation來(lái)保存網(wǎng)格數(shù)據(jù),即用三角網(wǎng)格來(lái)逼近表示的曲面,或更通用的一個(gè)形狀。

形狀的離散化由函數(shù)BRepMesh::Mesh()來(lái)統(tǒng)一處理,處理后就可以得到形狀用來(lái)顯示的多段線和三角網(wǎng)格數(shù)據(jù)。有了這些離散數(shù)據(jù),不管是將形狀交給顯示模塊進(jìn)行顯示,還是將形狀在其他顯示引擎中顯示,就很方便了。

在OpenCascade的BRep中也保存了形狀的用來(lái)顯示用的離散數(shù)據(jù),即多段線和三角網(wǎng)格。只有經(jīng)過(guò)BRepMesh::Mesh()離散化之后,形狀才具有這些數(shù)據(jù)。

二、細(xì)分曲線 Subdivision of Curves

在前面的一篇文章《在OpenSceneGraph中繪制OpenCascade的曲線 》中對(duì)曲線的顯示使用了統(tǒng)一細(xì)分處理(uniform subdivision),即將曲線在整個(gè)參數(shù)區(qū)域內(nèi)均分后得到一些線段來(lái)顯示。沒(méi)有考慮這樣的問(wèn)題:在曲線很平的區(qū)域內(nèi),就會(huì)存在冗余的點(diǎn);在曲線曲度很大的區(qū)域內(nèi),可能點(diǎn)的數(shù)量還不足以顯示出光滑的曲線。自適應(yīng)細(xì)分(Adaptive Subdivision)的方法就是將點(diǎn)放在最需要的地方,其主要目的是可視化曲線時(shí)更高效的渲染。通常這種方法主要用于游戲,因?yàn)槠滹@示更高效,性能更好。

wps_clip_image-27356

Figure 2.1 Uniform sampling on a curve

如上圖所示,統(tǒng)一采樣來(lái)繪制曲線時(shí),通常會(huì)在直線段區(qū)域生成很多多余的點(diǎn),而在曲線區(qū)域的點(diǎn)太少,不能表示出光滑的曲線。自適應(yīng)細(xì)分曲線有很多種方法,每種方法都會(huì)考慮速度、效率和精度,即如何用最少的點(diǎn)精確地表示出曲線。當(dāng)你理解這個(gè)基本概念后,也可以對(duì)其他方法進(jìn)行研究。

在OpenCascade中對(duì)曲線的細(xì)分使用的類是GCPnts_TangentialDeflection,其算法描述如下,感興趣的讀者可以結(jié)合源程序?qū)ζ渌惴▽?shí)現(xiàn)進(jìn)行研究:

wps_clip_image-9058

其中各個(gè)點(diǎn)的橫坐標(biāo)對(duì)應(yīng)的參數(shù)分別為:

wps_clip_image-26078

從上述公式結(jié)合向量的數(shù)量積公式可以看出,約束條件是兩個(gè)向量夾角的余弦值分別小于角度偏差和曲率偏差。算法將產(chǎn)生滿足約束條件的曲線上的最少數(shù)量的點(diǎn)。

wps_clip_image-20720

細(xì)分曲線后的點(diǎn)保存在類Poly_Polygon3D中。在BRep中也保存有多段線數(shù)據(jù),如下所示:

示例:

wps_clip_image-21527

BNF定義:

wps_clip_image-10682

詳細(xì)說(shuō)明:

<3D polygon record>定義了空間多段線(3D polyline)L,用來(lái)逼近空間參數(shù)曲線C。多段線的數(shù)據(jù)包含節(jié)點(diǎn)數(shù)m>=2,參數(shù)顯示標(biāo)志位p,逼近偏差(deflection)d>=0,節(jié)點(diǎn)Ni(1=<i<=m),參數(shù)ui(1=<i<=m)。當(dāng)參數(shù)顯示標(biāo)志位p=1時(shí),參數(shù)u才會(huì)顯示。多段線L通過(guò)這些節(jié)點(diǎn),多段線L逼近曲線C的逼近偏差定義如下所示:

wps_clip_image-18171

參數(shù)ui(1=<i<=m)是曲線C上通過(guò)節(jié)點(diǎn)Ni的參數(shù)值:

wps_clip_image-8816

示例數(shù)據(jù)表示的多段線為:m=2,參數(shù)顯示標(biāo)志位p=1,逼近偏差d=0.1,節(jié)點(diǎn)N1=(1,0,0),N2=(2,0,0),參數(shù)u1=0,u2=1。

三、細(xì)分曲面 Subdivision of surfaces

我們知道使用參數(shù)方程可以精確表示出三維曲線和曲面,但是參數(shù)方程表示的曲線曲面并不能直接交給OpenGL直接顯示出來(lái)。為此,圖形學(xué)中廣泛使用三角網(wǎng)格來(lái)表達(dá)三維模型,即用三角形組成的面片列表來(lái)近似逼近表示三維模型。

wps_clip_image-3413

Figure 3.1 Triangulation of Chinese Dragon

用三角網(wǎng)格表示的曲面需要解決幾個(gè)問(wèn)題:三角網(wǎng)格的產(chǎn)生、描述、遍歷、簡(jiǎn)化和壓縮等。在OpenCascade中三角網(wǎng)格的產(chǎn)生使用算法Delaunay三角剖分算法生成網(wǎng)格數(shù)據(jù),網(wǎng)格的描述使用類Poly_Triangulation。BRep文件中也保存三角網(wǎng)格的數(shù)據(jù),如下所示:

示例:

wps_clip_image-20489

BNF定義:

wps_clip_image-19514

詳細(xì)說(shuō)明:

<triangulation record>定義了逼近曲面S的三角剖分T(triangulation)。三角剖分的數(shù)據(jù)包含節(jié)點(diǎn)數(shù)m>=3,三角形數(shù)k>=1,參數(shù)顯示標(biāo)志位p,逼近偏差d>=0,節(jié)點(diǎn)Ni(1<=i<=m),參數(shù)對(duì)ui,vi(1<=i<=m),三角形nj,1,nj,2,nj,3。參數(shù)只有當(dāng)參數(shù)顯示標(biāo)志位p=1時(shí)才顯示。三角剖分逼近曲面的偏差d定義如下所示:

wps_clip_image-24429

參數(shù)對(duì)ui,vi描述了曲面S上過(guò)節(jié)點(diǎn)Ni的參數(shù):

wps_clip_image-20588

三角形nj,1, nj,2, nj,3用來(lái)取得三角形的三個(gè)頂點(diǎn)值Nnj,1,Nnj,2,Nnj,3,節(jié)點(diǎn)遍歷的順序就是Nnj,1,Nnj,2,Nnj,3。從三角剖分T的任意一側(cè)遍歷,所有三角形都有相同的方向:順時(shí)針或逆時(shí)針。

三角剖分中的三角形數(shù)據(jù):

wps_clip_image-30677

表示的三角剖分為:m=4個(gè)節(jié)點(diǎn),k=2個(gè)三角形,參數(shù)顯示標(biāo)志位p=1,逼近偏差d=0,節(jié)點(diǎn)N1(0,0,0),N2(0,0,3),N3(0,2,3),N4(0,2,0),參數(shù)值(u1,v1)=(0,0),(u2,v2)=(3,0),(u3,v3)=(3,-2),(u4,v4)=(0,-2)。從點(diǎn)(1,0,0)((-1,0,0)),三角形是順時(shí)針(逆時(shí)針)的。

四、程序示例 Code Example

通過(guò)創(chuàng)建多段線和三角網(wǎng)格數(shù)據(jù)并將其輸出,可以理解BRep文件中用來(lái)顯示的離散的數(shù)據(jù)結(jié)構(gòu)。程序示例如下所示:

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2013-12-12 21:46
*        Version : 1.0v
*
*    Description : There are two kind of data for shape representation 
*                  of the BRep file of OpenCascade. One is Polyline to
*                  approximates a 3D curve; the other is triangulations
*                  to approximates a surface.
*
*       KeyWords : OpenCascade, BRep File, Polygon, Triangulation
*                  
*/

#define WNT
#include 
<TColStd_Array1OfReal.hxx>
#include 
<TColgp_Array1OfPnt.hxx>
#include 
<TColgp_Array1OfPnt2d.hxx>

#include 
<Poly.hxx>
#include 
<Poly_Polygon3D.hxx>
#include 
<Poly_Array1OfTriangle.hxx>
#include 
<Poly_Triangulation.hxx>

#pragma comment(lib, 
"TKernel.lib")
#pragma comment(lib, 
"TKMath.lib")

int main(void)
{
    
// 3D Polygons:
    
// Polygon3D 1
    
// 2 1
    
// 0.1
    
// 1 0 0 2 0 0
    
// 0 1
    TColStd_Array1OfReal parameters(12);
    TColgp_Array1OfPnt nodes(
12);
    Handle_Poly_Polygon3D polyline;

    nodes.SetValue(
1, gp_Pnt(100));
    nodes.SetValue(
2, gp_Pnt(200));

    parameters.SetValue(
10.0);
    parameters.SetValue(
21.0);

    polyline 
= new Poly_Polygon3D(nodes, parameters);
    polyline
->Deflection(0.1);

    Poly::Write(polyline, std::cout);
    Poly::Write(polyline, std::cout, 
false);

    
// Triangulations.
    
// 4 2 1 0
    
// 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 
    Standard_Integer nodeCount = 4;
    Standard_Integer triangleCount 
= 2;
    Standard_Real deflection 
= 0.0;
    Standard_Boolean hasUV 
= Standard_True;

    TColgp_Array1OfPnt triNodes(
1, nodeCount);
    TColgp_Array1OfPnt2d UVNodes(
1, nodeCount);
    Poly_Array1OfTriangle triangles(
1, triangleCount);
    Handle_Poly_Triangulation triangulation;

    triNodes(
1).SetCoord(000);
    triNodes(
2).SetCoord(003);
    triNodes(
3).SetCoord(023);
    triNodes(
4).SetCoord(020);

    UVNodes(
1).SetCoord(0.00.0);
    UVNodes(
2).SetCoord(3.00.0);
    UVNodes(
3).SetCoord(3.0-2.0);
    UVNodes(
4).SetCoord(0.0-2.0);

    triangles(
1).Set(243);
    triangles(
2).Set(214);

    triangulation 
= new Poly_Triangulation(triNodes, UVNodes, triangles);
    triangulation
->Deflection(deflection);

    Poly::Write(triangulation, std::cout);
    Poly::Write(triangulation, std::cout, 
false);

    
return 0;
}

輸出結(jié)果如下所示:

 

Poly_Polygon3D
2 1
0.1
1 0 0
2 0 0
0 1
Poly_Polygon3D
       
2 Nodes
with parameters
Deflection : 
0.1

Nodes :
         
1 :                 1                 0                 0
         
2 :                 2                 0                 0

Parameters :
0 1
Poly_Triangulation
4 2 1
0
0 0 0
0 0 3
0 2 3
0 2 0
0 0
3 0
3 -2
0 -2
2 4 3
2 1 4
Poly_Triangulation
       
4 Nodes
       
2 Triangles
with UV nodes
Deflection : 
0

3D Nodes :
         
1 :                 0                 0                 0
         
2 :                 0                 0                 3
         
3 :                 0                 2                 3
         
4 :                 0                 2                 0

UV Nodes :
         
1 :                 0                 0
         
2 :                 3                 0
         
3 :                 3                -2
         
4 :                 0                -2

Triangles :
         
1 :          2          4          3
         
2 :          2          1          4
Press any key to 
continue . . .


五、結(jié)論

通過(guò)對(duì)OpenCascade中BRep文件中的離散數(shù)據(jù)的學(xué)習(xí),理解顯示用數(shù)據(jù)結(jié)構(gòu)及其實(shí)現(xiàn)。另外發(fā)現(xiàn)在類Poly和類BRepTools_ShapeSet中都有對(duì)多段線和三角網(wǎng)格進(jìn)行讀寫的函數(shù),有重復(fù)代碼,可以合并簡(jiǎn)化。

 

Feedback

# re: Representation Data in OpenCascade BRep  回復(fù)  更多評(píng)論   

2017-04-18 15:03 by Sirius
老師您好,我有一個(gè)小問(wèn)題,希望您有空的時(shí)候能解答一下。
GCPnts_TangentialDeflection::Initialize()函數(shù)中的兩個(gè)參數(shù)AngularDeflection和CurvatureDeflection應(yīng)該如何設(shè)置?有沒(méi)有具體實(shí)例可以參照一下呀?

# re: Representation Data in OpenCascade BRep  回復(fù)  更多評(píng)論   

2017-04-18 15:20 by eryar
@Sirius
這兩個(gè)參數(shù)越小,離散曲線得到的點(diǎn)越多,即越逼近真實(shí)曲線。

具體說(shuō)明看這個(gè)類的頭文件。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            av成人福利| 亚洲电影毛片| 国产精品yjizz| 久久久久久999| 欧美日韩三级在线| 欧美激情一区二区三区成人| 欧美美女bbbb| 亚洲精品视频啊美女在线直播| 国产精品综合色区在线观看| 一本色道久久综合亚洲精品高清| 韩国视频理论视频久久| 午夜在线视频观看日韩17c| 午夜在线精品| 国产伦精品一区二区三区照片91 | 欧美中文字幕在线播放| 久久色在线播放| 日韩视频一区二区在线观看| 欧美精品九九99久久| 亚洲嫩草精品久久| 欧美肥婆在线| 亚洲一区3d动漫同人无遮挡| 国产人妖伪娘一区91| 欧美激情按摩在线| 欧美一区亚洲一区| 一区二区日韩精品| 亚洲精品久久久久| 韩国欧美一区| 小嫩嫩精品导航| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲视频在线观看| 日韩午夜电影av| 亚洲精华国产欧美| 在线欧美日韩精品| 亚洲级视频在线观看免费1级| 久久www免费人成看片高清| 亚洲一区二区三区午夜| 亚洲国产日韩一区| 欧美顶级大胆免费视频| 欧美二区在线观看| 日韩亚洲成人av在线| 亚洲精品1区2区| 国产一区二区日韩| 国产精品视频一区二区高潮| 欧美亚洲不卡| 久久久精品一区| 老牛国产精品一区的观看方式| 欧美国产大片| 亚洲色图综合久久| 欧美一区二区三区久久精品| 欧美在线亚洲在线| 国内偷自视频区视频综合| 亚洲欧洲一区二区在线播放| 亚洲精品午夜精品| 国产视频久久久久| 中文网丁香综合网| 午夜精品剧场| 欧美午夜精品久久久久久孕妇 | 欧美一区二区三区另类| 亚洲国产一区二区在线| 国产精品蜜臀在线观看| av成人免费在线观看| 欧美中文字幕在线观看| 亚洲欧美成人综合| 亚洲尤物在线视频观看| 欧美激情中文不卡| 男女视频一区二区| 久久精品人人爽| 国产精品一区一区三区| 亚洲黑丝一区二区| 狠狠综合久久av一区二区小说| 在线亚洲一区观看| 国产精品免费小视频| 亚洲美女色禁图| 欧美激情一区二区| 国产在线观看一区| 亚洲欧美中日韩| 香蕉免费一区二区三区在线观看| 欧美日韩成人| 欧美制服丝袜第一页| 国产精品国产自产拍高清av王其 | 亚洲高清视频一区二区| 18成人免费观看视频| 免费高清在线视频一区·| 一二美女精品欧洲| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲国产精品女人久久久| 中日韩男男gay无套| 国产毛片一区| 欧美精品v国产精品v日韩精品 | 欧美中文字幕| 99精品免费网| 在线成人激情黄色| 亚洲欧美日韩一区二区| 欧美成人亚洲| 久久精品视频亚洲| 欧美视频在线观看| 最新高清无码专区| 一区二区三区在线看| 亚洲自拍偷拍网址| 亚洲国产欧美日韩精品| 久久国产欧美| 亚洲免费视频在线观看| 亚洲另类自拍| 亚洲国产精品精华液网站| 欧美一区2区三区4区公司二百| 国产精品热久久久久夜色精品三区| 久久综合九色欧美综合狠狠| 亚洲一区二区在线观看视频| 亚洲福利一区| 亚洲国产日韩欧美一区二区三区| 久久婷婷国产综合国色天香| 国产精品一区二区a| 欧美日本韩国在线| 久久久久一区| 欧美高清视频在线观看| 六月丁香综合| 亚洲欧洲日产国码二区| 国产欧美日韩精品丝袜高跟鞋| 国产精品久在线观看| 国产精品久久综合| 国语自产偷拍精品视频偷| 韩国一区电影| 亚洲激情社区| 亚洲视频一区二区免费在线观看| 99国产麻豆精品| 亚洲欧美在线播放| 在线观看视频日韩| 亚洲人成在线播放网站岛国| 欧美精品www| 国产精品一二三四| 禁断一区二区三区在线| 99精品国产高清一区二区| 亚洲曰本av电影| 亚洲精品国产精品国自产在线 | 亚洲国产福利在线| 亚洲黄页一区| 久久国产直播| 亚洲欧美另类在线| 免费亚洲网站| 欧美一区二区三区婷婷月色| 久久深夜福利免费观看| 亚洲摸下面视频| 每日更新成人在线视频| 99国产精品99久久久久久粉嫩| 欧美电影在线观看| 午夜精品美女久久久久av福利| 欧美精品一区二区视频| 亚洲第一级黄色片| 欧美在线视频免费| 亚洲午夜成aⅴ人片| 妖精成人www高清在线观看| 久久激情综合网| 国产在线日韩| 久久久精品国产99久久精品芒果| 一区二区三区视频在线| 欧美日韩免费观看一区| 亚洲精品影院在线观看| 欧美二区在线播放| 欧美r片在线| 亚洲久久成人| 99riav1国产精品视频| 亚洲砖区区免费| 国产精品视频免费观看www| 久久精品视频导航| 久久精品在线| 一本色道久久加勒比精品| 99伊人成综合| 韩国久久久久| 亚洲欧洲在线免费| 国产精品私房写真福利视频| 欧美一区二区三区免费观看| 欧美一区二区三区视频在线观看| 亚洲国产电影| 亚洲午夜精品一区二区| 激情一区二区| 亚洲一区二区三区久久| 亚洲国产成人av在线| 在线亚洲一区二区| 亚洲免费不卡| 久久国产精品99精品国产| 日韩视频欧美视频| 麻豆成人91精品二区三区| 亚洲性av在线| 欧美va亚洲va日韩∨a综合色| 欧美专区福利在线| 欧美www视频在线观看| 免费亚洲电影| 欧美国产日韩一区二区| 欧美在线播放一区| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久国产精品久久久久久电车| 欧美在线啊v| 激情视频亚洲| 麻豆成人在线观看| 亚洲第一福利在线观看| 亚洲第一免费播放区| 欧美激情精品久久久久久变态| 亚洲国产一区二区在线| 亚洲欧美电影院| 国内成+人亚洲|