曲線離散化之GCPnts包解析


@版權(quán)聲明:本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載讼庇,但未經(jīng)作者同意必須保留此段聲明绎巨,且在文章頁(yè)面明顯位置給出,
本文鏈接http://www.reibang.com/p/92ede833b8bc
如有問(wèn)題, 可郵件(yumxuanyi@qq.com)咨詢(xún)蠕啄。


關(guān)鍵字:OpenCASCADE场勤、OpenGL、曲線離散化歼跟、GCPnts

一和媳、概要

計(jì)算機(jī)圖形學(xué)中繪制曲線,無(wú)論是繪制參數(shù)曲線還是非參數(shù)曲線哈街,都需要先將參數(shù)曲線進(jìn)行離散化留瞳,通過(guò)離散化得到一組離散化的點(diǎn)集,然后再將點(diǎn)集發(fā)送給圖形渲染管線進(jìn)行處理骚秦,最終生成我們想要的曲線她倘。

OpenCASCADE中提供了GCPnts包。利用GCPnts包中提供的類(lèi)作箍,我們可以很方便的將三維曲線進(jìn)行離散化帝牡。

二、GCPnts包中各種類(lèi)說(shuō)明

1. GCPnts_AbscissaPoint 弧長(zhǎng)點(diǎn)算法

a. 可以用來(lái)計(jì)算曲線長(zhǎng)度蒙揣。
b. 用來(lái)計(jì)算曲線上與給定參數(shù)位置間隔一定弧長(zhǎng)的位置點(diǎn)靶溜。

其中b很有用,后面均勻弧長(zhǎng)算法內(nèi)部就用到了
通過(guò)函數(shù)積分來(lái)計(jì)算曲線弧長(zhǎng)
math_GaussSingleIntegration: 該類(lèi)使用高斯勒讓得積分算法,實(shí)現(xiàn)了對(duì)只有一個(gè)自變量的函數(shù)求積分

算法如下:

  1. 微元弧長(zhǎng) ds
    已知曲線Adaptor3d_Curve adaptorCurve,可以求得任意一點(diǎn)的切向量
    gp_Pnt curentPnt; gp_Vec curVec;
    adaptorCurve.D1(parameter,curentPnt,curVec);
    切向量的兩個(gè)坐標(biāo)就是dx 和 dy,
    所以對(duì)于曲線有微元弧長(zhǎng) ds = sqrt(dx^2 + dy^2) =curVec.Magnitude();
  2. 根據(jù)高斯-勒讓得積分公式進(jìn)行積分求解懒震。
    根據(jù)積分點(diǎn)和權(quán)重近似計(jì)算函數(shù)積分罩息。這個(gè)近似精度非常高
    “”
2. GCPnts_QuasiUniformAbscissa 準(zhǔn)均勻弧長(zhǎng)分布算法

功能:計(jì)算的曲線上的一組離散點(diǎn),這些點(diǎn)按弧長(zhǎng)均勻分布个扰。
說(shuō)明: 該方法需要指定一個(gè)期望的離散點(diǎn)的個(gè)數(shù)瓷炮。
算法:每?jī)蓚€(gè)連續(xù)的離散點(diǎn)之間的弧長(zhǎng)相等。
事例代碼:

  //GCPnts_QuasiUniformAbscissa 準(zhǔn)均勻弧長(zhǎng)分布算法  也就是等弧長(zhǎng)分布
  // 計(jì)算一組按弧長(zhǎng)均勻分布的離散點(diǎn)   
  // 可以根據(jù)指定的弧長(zhǎng) 或者指定的多少個(gè)點(diǎn)
  //Abscissa is the curvilinear distance between  two consecutive points of the distribution 
  //Abscissa 表示連續(xù)的兩個(gè)分布點(diǎn)之間的弧長(zhǎng) 
  //算法 兩點(diǎn)之間的弧長(zhǎng)等于的弧長(zhǎng)  
  GCPnts_QuasiUniformAbscissa  QUATooler;

  //curveLength 可以由GCPnts_AbscissaPoint求得這里取曲線總長(zhǎng)的兩倍  
  Standard_Integer  needPointsCount = curveLength * 2.0;  //表示期望的點(diǎn)數(shù)量

  QUATooler.Initialize(adaptorCurve, needPointsCount);//取兩倍曲線長(zhǎng)度的點(diǎn) 也就是0.5mm弧長(zhǎng)一個(gè)點(diǎn)

  Standard_Integer pointsCount = QUATooler.NbPoints();
  TColgp_SequenceOfPnt SeqP; 
  for (int i = 1; i <= pointsCount; i++) 
  {    
    SeqP.Append(adaptorCurve.Value(QUATooler.Parameter(i)));
  }

注:半徑50圓 GCPnts_QuasiUniformAbscissa計(jì)算的點(diǎn)有628個(gè)递宅。

3. GCPnts_UniformAbscissa 均勻弧長(zhǎng)分布算法

功能:同方法GCPnts_QuasiUniformAbscissa娘香,用于計(jì)算的曲線上的一組離散點(diǎn)苍狰,這些點(diǎn)按弧長(zhǎng)均勻分布。
但是提供兩種方式: a. 指定期望點(diǎn)的個(gè)數(shù) b. 指定弧長(zhǎng)烘绽。
事例代碼:

GCPnts_UniformAbscissa UATooler;  
//a 指定期望點(diǎn)的個(gè)數(shù)  
//同GCPnts_QuasiUniformAbscissa 這里不舉例  
//UATooler.Initialize(adaptorCurve, needPointsCount);  
//b 指定弧長(zhǎng)   
 Standard_Real abscissa = 10;//弧長(zhǎng)10mm
 UATooler.Initialize(adaptorCurve, abscissa);  
 Standard_Integer pntCount = UATooler.NbPoints();  TColgp_SequenceOfPnt SeqP; 
 for (int i = 1; i <= pntCount; i++) 
 {    
    SeqP.Append(adaptorCurve.Value(UATooler.Parameter(i))); 
 }

注:半徑50圓 弧長(zhǎng) 0.5mm 計(jì)算的點(diǎn)有630個(gè)
2 * 3.1415926 * 50 / 0.5 = 628.31852
半徑50圓 弧長(zhǎng) 10mm 計(jì)算的點(diǎn)有33個(gè)
2 * 3.1415926 * 50 / 10 = 31.415926

4. GCPnts_QuasiUniformDeflection 準(zhǔn)均勻偏差分布算法

功能:計(jì)算的曲線上的一組離散點(diǎn)淋昭。
算法說(shuō)明:
假定 Pi 和 Pj為 分布的兩連續(xù)的離散點(diǎn) ,它們的參數(shù)為ui和uj。
計(jì)算偏差deflection :Pi和Pj連線(弦長(zhǎng))的中點(diǎn)和曲線上中間參數(shù) [(ui+uj) / 2 ] 位置點(diǎn)之間的距離安接。
則兩連續(xù)的離散點(diǎn)的計(jì)算偏差deflection必須小于給定的偏差Deflection值翔忽。
事例代碼:

GCPnts_QuasiUniformDeflection QUDTooler;  
QUDTooler.Initialize(adaptorCurve, 1.e-5);//這里我們要求 deflection <= 1.e-5  
Standard_Integer pointsLength = QUDTooler.NbPoints();  TColgp_SequenceOfPnt SeqP;  
for (int i = 1; i <= pointsLength; i++) 
 {   
    SeqP.Append(QUDTooler.Value(i)); 
 }

注:半徑50圓 準(zhǔn)均勻偏差分布算法計(jì)算的點(diǎn)有4969個(gè)。

5. GCPnts_UniformDeflection 均勻偏差算法

功能:用于計(jì)算C2連續(xù)的曲線上的一組離散點(diǎn)盏檐。
該算法比較耗時(shí)歇式。請(qǐng)使用GCPnts_QuasiUniformDeflection算法。
GCPnts_QuasiUniformDeflection方法可以用于計(jì)算非C2連續(xù)的曲線胡野。

6. GCPnts_TangentialDeflection 切矢量偏離算法

功能:計(jì)算的曲線上的一組離散點(diǎn)材失。
算法原理:如果P1(u1)和 P2(u2) 曲線上兩個(gè)連續(xù)的離散點(diǎn)。
P3 表示曲線上中間參數(shù) ((u1+u2)/2)點(diǎn)硫豆。
則P3需要滿足如下條件:
條件1: ||P1P3^P3P2||/||P1P3||*||P3P2||<AngularDeflection
偏轉(zhuǎn)角度小于給定的角度AngularDeflection
a * b = |a||b|cosθ 也就是 cosθ < AngularDeflection
條件2 : ||P1P2^P1P3||/||P1P2||<CurvatureDeflection
表示曲線切線 與 弦長(zhǎng)夾角要小于 給定的曲線偏離率CurvatureDeflection
|a|cosθ < CurvatureDeflection

事例代碼:

GCPnts_TangentialDeflection  TDTooler;  //聲明算法類(lèi)
Standard_Real AngularDeflection = 1 / M_PI_4;  //這里去角度偏差1 / M_PI_4
Standard_Real CurvatureDeflection = 1.e-5;  //這里去曲率偏差 1.e-5
TDTooler.Initialize(adaptorCurve, AngularDeflection, CurvatureDeflection); //算法初始化
Standard_Integer PLength = TDTooler.NbPoints();  
TColgp_SequenceOfPnt SeqP
 for (int i = 1; i <= PLength; i++)  
{    
   SeqP.Append(TDTooler.Value(i));
 }

注:半徑50圓 使用切矢量偏離算法計(jì)算的點(diǎn)有4969個(gè)豺憔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市够庙,隨后出現(xiàn)的幾起案子恭应,更是在濱河造成了極大的恐慌,老刑警劉巖耘眨,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昼榛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡剔难,警方通過(guò)查閱死者的電腦和手機(jī)胆屿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)偶宫,“玉大人非迹,你說(shuō)我怎么就攤上這事〈壳鳎” “怎么了憎兽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吵冒。 經(jīng)常有香客問(wèn)我纯命,道長(zhǎng),這世上最難降的妖魔是什么痹栖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任亿汞,我火速辦了婚禮,結(jié)果婚禮上揪阿,老公的妹妹穿的比我還像新娘疗我。我一直安慰自己咆畏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布吴裤。 她就那樣靜靜地躺著旧找,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嚼摩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天矿瘦,我揣著相機(jī)與錄音枕面,去河邊找鬼。 笑死缚去,一個(gè)胖子當(dāng)著我的面吹牛潮秘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播易结,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼枕荞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搞动?” 一聲冷哼從身側(cè)響起躏精,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹦肿,沒(méi)想到半個(gè)月后矗烛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箩溃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年瞭吃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣旨。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歪架,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霹陡,到底是詐尸還是另有隱情和蚪,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布烹棉,位于F島的核電站惠呼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏峦耘。R本人自食惡果不足惜剔蹋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辅髓。 院中可真熱鬧泣崩,春花似錦少梁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至买优,卻和暖如春妨马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杀赢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工烘跺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脂崔。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓滤淳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砌左。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脖咐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354