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

eryar

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

Representation Data in OpenCascade BRep

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

Representation Data in OpenCascade BRep

eryar@163.com

摘要Abstract:現在的顯示器大多數是光柵顯示器,即可以看做一個像素的矩陣。在光柵顯示器上顯示的任何圖形,實際上都是一些具有一種或多種顏色的集合。數學上精確表示的圖形在顯示器中只能用逼近的方式顯示出來。本文主要對OpenCascade的BRep文件中用來顯示曲線和曲面的離散數據結構進行說明。

關鍵字:OpenCascade, BRep, Polygon, Triangulation, Subdivision Curves,

一、引言 Introduction

光柵圖形顯示器可以看做一個像素矩陣。在光柵顯示器上顯示的任何一種圖形,實際上都是一些具有一種或多種顏色的像素的集合。在數學上,理想的曲線是沒有寬度的,它是由無數個點構成的集合,而當要顯示曲線時,就不能用無數個點在顯示器中顯示,必須對其進行離散化,即細分處理。考慮性能要求,需要用盡可能少的點來顯示曲線。對于曲面也是一樣,雖然已經有曲面的數學解析表示,但是需要在顯示器中顯示時,必須對其離散化,即三角剖分得到的逼近曲面的三角網格。

在OpenCascade中已經有曲線和曲面的精確的數學解析表達形式的類,如下圖所示:

wps_clip_image-26135

Figure 1.1 Parametric geometry curves

wps_clip_image-30917

Figure 1.2 Parametric geometry surfaces

在OpenGL中顯示這些曲線和曲面時,不能直接顯示出由參數方程精確表示的曲線和曲面,必須對曲線和曲面進行細分,即離散化,得到OpenGL顯示用的點和三角網格。

在OpenCascade中使用類Poly_Polygon3D/Poly_Polygon2D來保存多段線的數據,即可以用來保存逼近顯示由參數方程精確表示的曲線的離散點數據。

在OpenCascade中使用類Poly_Triangulation來保存網格數據,即用三角網格來逼近表示的曲面,或更通用的一個形狀。

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

在OpenCascade的BRep中也保存了形狀的用來顯示用的離散數據,即多段線和三角網格。只有經過BRepMesh::Mesh()離散化之后,形狀才具有這些數據。

二、細分曲線 Subdivision of Curves

在前面的一篇文章《在OpenSceneGraph中繪制OpenCascade的曲線 》中對曲線的顯示使用了統一細分處理(uniform subdivision),即將曲線在整個參數區域內均分后得到一些線段來顯示。沒有考慮這樣的問題:在曲線很平的區域內,就會存在冗余的點;在曲線曲度很大的區域內,可能點的數量還不足以顯示出光滑的曲線。自適應細分(Adaptive Subdivision)的方法就是將點放在最需要的地方,其主要目的是可視化曲線時更高效的渲染。通常這種方法主要用于游戲,因為其顯示更高效,性能更好。

wps_clip_image-27356

Figure 2.1 Uniform sampling on a curve

如上圖所示,統一采樣來繪制曲線時,通常會在直線段區域生成很多多余的點,而在曲線區域的點太少,不能表示出光滑的曲線。自適應細分曲線有很多種方法,每種方法都會考慮速度、效率和精度,即如何用最少的點精確地表示出曲線。當你理解這個基本概念后,也可以對其他方法進行研究。

在OpenCascade中對曲線的細分使用的類是GCPnts_TangentialDeflection,其算法描述如下,感興趣的讀者可以結合源程序對其算法實現進行研究:

wps_clip_image-9058

其中各個點的橫坐標對應的參數分別為:

wps_clip_image-26078

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

wps_clip_image-20720

細分曲線后的點保存在類Poly_Polygon3D中。在BRep中也保存有多段線數據,如下所示:

示例:

wps_clip_image-21527

BNF定義:

wps_clip_image-10682

詳細說明:

<3D polygon record>定義了空間多段線(3D polyline)L,用來逼近空間參數曲線C。多段線的數據包含節點數m>=2,參數顯示標志位p,逼近偏差(deflection)d>=0,節點Ni(1=<i<=m),參數ui(1=<i<=m)。當參數顯示標志位p=1時,參數u才會顯示。多段線L通過這些節點,多段線L逼近曲線C的逼近偏差定義如下所示:

wps_clip_image-18171

參數ui(1=<i<=m)是曲線C上通過節點Ni的參數值:

wps_clip_image-8816

示例數據表示的多段線為:m=2,參數顯示標志位p=1,逼近偏差d=0.1,節點N1=(1,0,0),N2=(2,0,0),參數u1=0,u2=1。

三、細分曲面 Subdivision of surfaces

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

wps_clip_image-3413

Figure 3.1 Triangulation of Chinese Dragon

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

示例:

wps_clip_image-20489

BNF定義:

wps_clip_image-19514

詳細說明:

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

wps_clip_image-24429

參數對ui,vi描述了曲面S上過節點Ni的參數:

wps_clip_image-20588

三角形nj,1, nj,2, nj,3用來取得三角形的三個頂點值Nnj,1,Nnj,2,Nnj,3,節點遍歷的順序就是Nnj,1,Nnj,2,Nnj,3。從三角剖分T的任意一側遍歷,所有三角形都有相同的方向:順時針或逆時針。

三角剖分中的三角形數據:

wps_clip_image-30677

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

四、程序示例 Code Example

通過創建多段線和三角網格數據并將其輸出,可以理解BRep文件中用來顯示的離散的數據結構。程序示例如下所示:

/*
*    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;
}

輸出結果如下所示:

 

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 . . .


五、結論

通過對OpenCascade中BRep文件中的離散數據的學習,理解顯示用數據結構及其實現。另外發現在類Poly和類BRepTools_ShapeSet中都有對多段線和三角網格進行讀寫的函數,有重復代碼,可以合并簡化。

 

Feedback

# re: Representation Data in OpenCascade BRep  回復  更多評論   

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

# re: Representation Data in OpenCascade BRep  回復  更多評論   

2017-04-18 15:20 by eryar
@Sirius
這兩個參數越小,離散曲線得到的點越多,即越逼近真實曲線。

具體說明看這個類的頭文件。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久中文字幕导航| 午夜免费在线观看精品视频| 国产精品亚洲综合天堂夜夜| 久久99伊人| 欧美在线网址| 欧美在线地址| 久久久综合网站| 久久久亚洲精品一区二区三区 | 午夜在线视频一区二区区别 | 国产精品porn| 欧美日韩午夜剧场| 国产精品99免费看| 国产精品久久久久aaaa| 欧美亚韩一区| 狠狠色伊人亚洲综合网站色| 国产日产精品一区二区三区四区的观看方式| 欧美巨乳在线| 欧美日韩一区二区在线| 国产精品久久久久久久久免费樱桃 | 亚洲日本免费电影| 久久精品av麻豆的观看方式| 欧美亚洲免费电影| 亚洲私人黄色宅男| 免费精品99久久国产综合精品| 国产欧美日韩高清| 国产精品99一区二区| 国产欧美激情| 亚洲成色精品| 亚洲——在线| 免费观看国产成人| 一区二区激情| 欧美在线一二三区| 欧美日韩成人在线观看| 国产三级精品在线不卡| 亚洲精品欧美| 久久久精品一区| 亚洲精品欧美专区| 久久精品观看| 欧美性猛片xxxx免费看久爱| 91久久国产自产拍夜夜嗨| 性欧美xxxx视频在线观看| 亚洲国产精品成人综合色在线婷婷 | 国产主播一区二区| 亚洲性图久久| av不卡在线| 久久青青草综合| 国产无一区二区| 亚洲制服欧美中文字幕中文字幕| 欧美黄色免费网站| 开心色5月久久精品| 激情懂色av一区av二区av| 欧美中文字幕在线视频| 亚洲先锋成人| 欧美视频中文字幕在线| 日韩视频免费观看| 亚洲精品乱码| 亚洲精品一线二线三线无人区| 欧美一级黄色网| 亚洲国产天堂久久国产91| 久久精品夜色噜噜亚洲a∨| 国产日产亚洲精品| 欧美专区在线观看一区| 亚洲一区成人| 国产精品影音先锋| 久久激情久久| 久久aⅴ乱码一区二区三区| 国产欧美一区二区三区沐欲| 欧美一区2区视频在线观看 | 99视频一区| 亚洲精品综合久久中文字幕| 欧美精品久久久久久久久老牛影院| 亚洲福利视频在线| 亚洲国产欧洲综合997久久| 欧美激情网站在线观看| 一区二区三区四区五区视频| 亚洲网友自拍| 欧美精品一区二区视频| 亚洲网站在线播放| 欧美一区二区成人6969| 亚洲第一福利在线观看| 亚洲精选一区| 国产精品视频第一区| 久久精品亚洲热| 欧美成人精品激情在线观看| 99精品视频网| 欧美亚洲自偷自偷| 亚洲日本成人女熟在线观看| 一区二区三区成人精品| 国产在线高清精品| 欧美激情1区2区3区| 免费日韩av片| 午夜精品久久久久久久99热浪潮 | 亚洲午夜性刺激影院| 亚洲一区二区在线| 国产乱码精品1区2区3区| 欧美日本一道本在线视频| 免费一区视频| 伊人久久av导航| 国产亚洲人成a一在线v站| 国产精品高潮呻吟久久| 亚洲激情校园春色| 黄色精品在线看| 久久午夜精品一区二区| 亚洲欧美99| 一区二区三区在线视频播放| 久久久精品久久久久| 亚洲一区免费视频| 久久久久久久久一区二区| 91久久综合| 亚洲激情专区| 亚洲精品国产精品国自产在线| 国产精品高清一区二区三区| 久久精品免费观看| 美女被久久久| 香蕉av777xxx色综合一区| 看欧美日韩国产| 香蕉乱码成人久久天堂爱免费 | 日韩亚洲欧美一区| 亚洲欧美经典视频| 在线观看日韩一区| 亚洲欧美乱综合| 9人人澡人人爽人人精品| 久久精品国产一区二区三| 亚洲一区二区视频在线| 久久九九久精品国产免费直播| 一区二区三区四区国产精品| 毛片基地黄久久久久久天堂| 小处雏高清一区二区三区| 欧美日韩中文另类| 欧美大片91| 精品1区2区3区4区| 欧美与欧洲交xxxx免费观看 | 欧美高清在线| 激情婷婷亚洲| 久久精品国产精品亚洲| 久久久精品999| 国产亚洲精品aa午夜观看| 亚洲欧美韩国| 午夜在线视频观看日韩17c| 国产精品久久国产精品99gif | 国产亚洲精品aa午夜观看| 亚洲欧美一区二区三区极速播放| 亚洲一二三区精品| 国产精品a久久久久久| 一本色道久久88综合亚洲精品ⅰ| 一区二区不卡在线视频 午夜欧美不卡在 | 久久精品综合| 久久综合一区二区| 激情欧美日韩一区| 久久全球大尺度高清视频| 蜜乳av另类精品一区二区| 激情亚洲网站| 嫩草成人www欧美| 亚洲欧洲日产国产综合网| 一本不卡影院| 国产精品日韩欧美一区| 香蕉久久久久久久av网站| 久久久久久久久久久久久久一区| 黄色精品一区二区| 欧美女人交a| 午夜激情亚洲| 亚洲第一精品福利| 亚洲综合日韩| 久久―日本道色综合久久| 国产午夜精品全部视频播放| 性一交一乱一区二区洋洋av| 久久综合狠狠综合久久综合88| 激情欧美丁香| 欧美日产一区二区三区在线观看 | 亚洲一区不卡| 免费人成网站在线观看欧美高清| 亚洲国产福利在线| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 国产精品日本一区二区| 久久国内精品自在自线400部| 亚洲国产成人精品视频| 亚洲调教视频在线观看| 激情自拍一区| 国产精品久久久久久久7电影 | 久久免费一区| 一二三区精品福利视频| 韩国三级电影久久久久久| 欧美日本免费| 久久精品国产视频| 一本色道88久久加勒比精品| 免费看av成人| 午夜精品区一区二区三| 91久久嫩草影院一区二区| 国产视频一区在线| 欧美视频一区二区三区…| 欧美 日韩 国产 一区| 亚洲欧美国产77777| 亚洲精品免费在线| 尹人成人综合网| 亚洲人成人一区二区三区| 麻豆成人小视频| 欧美波霸影院| 久久www成人_看片免费不卡 | 亚洲天堂av高清| 亚洲电影有码|