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

eryar

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

OpenCASCADE Conic to BSpline Curves-Parabola

Posted on 2014-10-02 23:21 eryar 閱讀(2858) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Conic to BSpline Curves-Parabola

eryar@163.com

Abstract. Rational Bezier Curve can represent conic curves such as circle, ellipse, hyperbola, .etc. But how to convert a conic curve to BSpline curve is still question, i.e. Represent a conic curve in BSpline form. Parabola curve is the most simple conic curve, that the parabola does not require rational functions. Let’s begin from the simplest one...

Key Words. OpenCASCADE, Convert, Parabola, BSplineCurve, Conic Curve

1. Introduction

圓錐截線(Conic或稱為二次曲線)和圓在CAD/CAM中有著廣泛應用。毫無疑問NURBS的一個最大優點就是既能精確表示圓錐截線和圓,也能精確表示自由曲線曲面。這個優點的意義是方便編程,使所有的曲線可以采用統一的數據結構來表示。通過有理的方式可以精確來表示這些二次曲線,那么給定一個二次曲線的相關參數(如圓的圓心和半徑等),如何構造出對應的NURBS曲線呢?

在圓錐截線中,拋物線(Parabola)是不需要用有理函數來表示的,所以是形式最簡單的二次曲線。先從簡單的著手,來學習如何將一個拋物線從隱式方程的形式轉換成NURBS曲線形式。

先簡要回顧一下高中數學中關于拋物線的相關知識點,如下圖所示為我上高中時數學課本中的關于拋物線方程及焦點坐標(focus)和準線(directrix)方程一個圖表:

wps_clip_image-23523

Figure 1.1 Parabola Fuction

OpenCASCADE中對應拋物線的隱式方程表示的類是gp_Parab/gp_Parab2d。本文主要介紹OpenCASCADE中如何將gp_Parab2d轉換為NURBS曲線。

2. Parametric Representations

在CAD/CAM的應用中,圓錐截線有兩種重要的參數表示形式:有理形式和最大內接面積形式(Rational and maximum inscribed area forms)。表示拋物線的這兩種形式是相同的,如下所示:

wps_clip_image-28078

圓錐截線的有些有理參數表示形式可能是有相當差的參數化,即均勻分布的參數值對應于曲線上分布很不均勻的點。利用線性有理函數對有理曲線進行重新參數化可以改變(因而可能改善)其參數化。

假設C(u)=(x(u), y(u))是一條在標準位置的圓錐截線的參數表示。現在我們對拋物線給出的參數方程也是上式,它是一個好的參數化:對于任意給定的整數n和參數邊界a與b,取n個等間隔分布的參數:

wps_clip_image-14708

點C(u1),C(u2), ..., C(un)形成曲線上n-1邊多邊形,它的閉合多邊形具有最大的內接面積。

根據最大內接面積表示法可以求出節點矢量。

3. Conversion Algorithm

將隱式表示的拋物線方程轉換為NURBS(有理Bezier是NURBS的特例)曲線需要確定NURBS的以下信息:節點矢量,權因子,次數,控制頂點。

因為拋物線是二次曲線,所以對應的NURBS曲線的次數也為2。因為是用有理的Bezier曲線來表示的,所以需要的控制頂點數為3。

其中節點矢量可由最大內接面積表示法來確定。下面來確定剩余的所需數據。由有理Bezier曲線的公式得二次有理Bezier曲線弧的表示形式為:

wps_clip_image-7907

稱k為形狀不變因子,公式如下所示:

wps_clip_image-28613

可以證明同一組控制頂點選取不同 的權因子,只要形狀因子k相等,則由它們決定的二次有理Bezier曲線是同一條曲線段,不同的權因對應不同的參數化,而且可以根據形狀不變因子對二次曲線進行分類:

v K=0;       表示退化的二次曲線:一對直線段P0P1和P1P2;

v K∈[0,1];  表示雙曲線;

v K=1;       表示拋物線;

v K∈[1, +∞]; 表示橢圓;

v K=+∞;     表示連接P0和P2的直線段;

習慣上我們選擇ω0=ω2=1稱為標準參數化。此時由形狀因子k公式得拋物線的ω1=1。所以拋物線的權因子也因此而確定,即ω0=ω1=ω2=1。

wps_clip_image-10048

Figure 3.1 不同的權因子ω1 定義的圓錐截線

由二次有理Bezier曲線公式可知,當u=0和u=1時,C(0)=P0, C(1)=P2,即曲線通過特征多邊形的首末頂點。由此可確定拋物線的兩個控制頂點P0和P2,現在只剩下最后一個P1頂點未確定。

P1點可以由二次有理Bezier曲線的公式列方程計算得出,但這并不是一個方便的方法。一種更方便的方法是:在這條曲線上指定第三個點,該點對應于某個特定的參數,例如u=1/2。點S=C(1/2)稱為圓錐截線的肩點(shoulder point),如圖3.1所示。將u=1/2代入二次有理Bezier公式得:

wps_clip_image-14682

其中M是弦P0P2的中點。肩點S=C(1/2)。所以由上式可確定P1點。下面將各個控制頂點的計算列出如下所示:

設拋物線的起止區間為[UF,UL],則因為曲線通過特征多邊形的頂點,所以通過首點P0=(X0,Y0)=(X0,UF)。又由拋物線的參數方程可知:

wps_clip_image-29846

同理可計算出通過末點P2的坐標,將他們分別列出如下:

wps_clip_image-23736

由計算肩點S的公式,將Sy=Y1=C(u1)=(UF+UL)/2代入可得:

wps_clip_image-19329

所以P1點的坐標為:

wps_clip_image-27527

至此,拋物線的三個控制頂點P0,P1,P2都已計算出來了。即拋物線的NURBS表示所需的數據都已經得到了。下面看看OpenCASCADE中的實現代碼。

4. Code Analysis

OpenCASCADE的Math工具集中有個包Covert用來將圓錐曲線曲面轉換為NURBS曲線曲面。其中轉換拋物線的類為:Convert_ParabolaToBSplineCurve,實現代碼如下所示:

 

//=======================================================================
//function : Convert_ParabolaToBSplineCurve
//purpose  : 
//=======================================================================
Convert_ParabolaToBSplineCurve::Convert_ParabolaToBSplineCurve 
  (
const gp_Parab2d&   Prb,
   
const Standard_Real U1 ,
   
const Standard_Real U2  )
: Convert_ConicToBSplineCurve (MaxNbPoles, MaxNbKnots, TheDegree) 
{
  Standard_DomainError_Raise_if( Abs(U2 
- U1) < Epsilon(0.),
                
"Convert_ParabolaToBSplineCurve");

  Standard_Real UF 
= Min (U1, U2);
  Standard_Real UL 
= Max( U1, U2);
  Standard_Real p 
= Prb.Parameter();

  nbPoles 
= 3;
  nbKnots 
= 2;
  isperiodic 
= Standard_False;
  knots
->ChangeArray1()(1= UF;  mults->ChangeArray1()(1= 3;
  knots
->ChangeArray1()(2= UL;  mults->ChangeArray1()(2= 3;

 weights
->ChangeArray1()(1= 1.;
 weights
->ChangeArray1()(2= 1.;
 weights
->ChangeArray1()(3= 1.;

  gp_Dir2d Ox 
= Prb.Axis().XDirection();
  gp_Dir2d Oy 
= Prb.Axis().YDirection();
  Standard_Real S 
= ( Ox.X() * Oy.Y() - Ox.Y() * Oy.X() > 0.) ?  1 : -1;

  
// poles expressed in the reference mark
  poles->ChangeArray1()(1= 
    gp_Pnt2d( ( UF 
* UF) / ( 2* p), S *   UF            );
  poles
->ChangeArray1()(2= 
    gp_Pnt2d( ( UF 
* UL) / ( 2* p), S * ( UF + UL) / 2. );
  poles
->ChangeArray1()(3= 
    gp_Pnt2d( ( UL 
* UL) / ( 2* p), S *   UL            );

  
// replace the bspline in the mark of the parabola
  gp_Trsf2d Trsf;
  Trsf.SetTransformation( Prb.Axis().XAxis(), gp::OX2d());
  poles
->ChangeArray1()(1).Transform( Trsf);
  poles
->ChangeArray1()(2).Transform( Trsf);
  poles
->ChangeArray1()(3).Transform( Trsf);
}

由上面的代碼可知,先設置曲線次數為2,再設置節點矢量為[UF,UF,UF,UL,UL,UL],即首參數UF和末參數UL的重數皆為3,由節點矢量可知轉換后的NURBS曲線為Bezier曲線。

三個控制頂點對應的權因也都設置為1。三個控制頂點計算方法按上一節中所述。關鍵是P1點的計算。上面的計算方法僅為個人觀點,歡迎討論交流。

最后根據有理Bezier曲線的仿射不變性:對有理Bezier曲線進行旋轉、平移和縮放變換,其表達式不變,只是控制點發生了改變。新的控制點可以通過對原控制點作變換得到。即要對有理Bezier曲線進行仿射變換,只需對其控制點作變換即可。

圓錐截線的轉換類的使用是很簡單的,且計算都是在構造函數中完成。下面給出一個將拋物線轉換為NURBS曲線的具體示例來說明其用法。

 

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2014-10-02 20:46
*        Version : 1.0v
*
*    Description : OpenCASCADE conic to BSpline curve-Parabola.
*
*      Key words : OpenCascade, Parabola, BSpline Curve, Convert
*/

#define HAVE_CONFIG_H

#include 
<gp_Parab2d.hxx>

#include 
<Convert_ParabolaToBSplineCurve.hxx>

void DumpConvertorInfo(const Convert_ConicToBSplineCurve &theConvertor)
{
    Standard_Integer aCounter 
= 0;
    
    std::cout 
<< "Convert Result" << std::endl;
    std::cout 
<< "Degree: " << theConvertor.Degree() << std::endl;
    std::cout 
<< "Periodic: " << (theConvertor.IsPeriodic() ? "yes" : "no"<< std::endl;
    
    std::cout 
<< "Knots: " << std::endl;
    
for (Standard_Integer i = 1;i <= theConvertor.NbKnots(); ++i)
    {
        
for (Standard_Integer j = 1; j <= theConvertor.Multiplicity(i); ++j)
        {
            std::cout 
<< ++aCounter << "" << theConvertor.Knot(i) << std::endl;
        }
    }
    
    std::cout 
<< "Poles(Weight): " << std::endl;
    
for (Standard_Integer i = 1; i <= theConvertor.NbPoles(); ++i)
    {
        gp_Pnt2d aPole 
= theConvertor.Pole(i);
        
        std::cout 
<< i << "" << aPole.X() << "" << aPole.Y() 
        
<< " W(" << theConvertor.Weight(i) << ")" << std::endl;
    }
}

void TestParabolaConversion(void)
{
    gp_Parab2d aParabola(gp::OX2d(), 
1.0);
    
    Convert_ParabolaToBSplineCurve aConvertor(aParabola, 
1.0, M_PI);
    
    DumpConvertorInfo(aConvertor);
}

int main(int argc, char **argv)
{
    TestParabolaConversion();
    
    
return 0;
}

程序開始部分需要定義HAVE_CONFIG_H,這與在Windows中編程定義WNT有所不同。程序輸出結果如下圖所示:

wps_clip_image-24708

Figure 4.1 Convert Parabola to BSpline Curve Result

5. Conclusion

NURBS的一個優勢就是統一了曲線曲面的表示方法,即不僅可以表示自由曲線曲面,還可精確表示圓錐曲線曲面。其中拋物線是最簡單的圓錐截線,從簡單的拋物線轉換成NURBS曲線著手,學習NURBS是如何來表示圓錐截線的。

第一次使用Debian系統來編程,選用了一個輕量級的IDE開發工具Codelite,用法與Visual Studio類似。期間也遇到包含引用目錄及程序運行時找不到動態庫的問題。其中在Codelite中添加引用庫路徑的方法如下圖所示:

wps_clip_image-29650

Figure 5.1 Set Library Path and Add Libraries in Codelite

添加上述引用庫后,解決了鏈接錯誤,但是直接運行程序,發現也有與在Windows中類似的問題,即缺少依賴的動態庫,如下圖所示為使用lld命令檢查程序的依賴項。最后通過向ld.so.conf中添加動態庫所在的目錄解決了問題。相關命令如下所示:

# cat /etc/ld.so.conf 

include ld.so.conf.d
/*.conf 

# echo "/home/eryar/opencascade-6.7.1/lib" >> /etc/ld.so.conf 

# ldconfig 

注:以上命令需要有root權限。

wps_clip_image-20163

Figure 5.2 Use lld command to check depends

通過解決以上的問題,來適應在Debian中使用Codelite開發程序。

6. References

1. 人民教育出版社中學數學室. 數學第二冊(上). 人民教育出版社. 2000

2. 趙罡,穆國旺,王拉柱譯. 非均勻有理B樣條. 清華大學出版社. 2010

3. 王仁宏,李崇君,朱春鋼. 計算幾何教程. 科學出版社. 2008

PDF Version and Sample Code: OpenCASCADE Conic to BSpline Curves-Parabola

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产| 国产女同一区二区| 欧美日本在线一区| 国语精品中文字幕| 午夜视频在线观看一区二区三区| 欧美激情一区二区三区 | 欧美成人日韩| 韩国精品在线观看| 性做久久久久久免费观看欧美 | 欧美在线观看一区二区| 欧美视频中文字幕在线| 一区二区欧美日韩| 亚洲高清电影| 美玉足脚交一区二区三区图片| 亚洲制服av| 亚洲视频视频在线| 亚洲精品视频二区| 久久中文字幕一区二区三区| 亚洲综合日韩在线| 国产精品久久91| 午夜亚洲福利在线老司机| 亚洲香蕉视频| 国产网站欧美日韩免费精品在线观看 | 欧美一区二区三区四区在线观看 | 91久久精品国产91性色tv| 美女久久一区| 欧美成人一区二区三区| 一本一道久久综合狠狠老精东影业| 亚洲激情偷拍| 欧美日精品一区视频| 亚洲一区图片| 亚欧美中日韩视频| 最新日韩在线| 亚洲视频999| 一色屋精品亚洲香蕉网站| 亚洲国产精品久久久久秋霞不卡| 欧美日韩国产电影| 久久精品亚洲| 欧美电影在线| 午夜精品影院在线观看| 久久99伊人| 99热免费精品| 性做久久久久久久久| 亚洲第一搞黄网站| 亚洲免费av片| 国内激情久久| 99re成人精品视频| 影音先锋日韩资源| 一区二区av| 影音先锋久久久| 一区二区三区视频在线观看| 又紧又大又爽精品一区二区| 99国产成+人+综合+亚洲欧美| 国产一区二区剧情av在线| 亚洲伦伦在线| 亚洲国产成人tv| 亚洲你懂的在线视频| 亚洲国产精品嫩草影院| 亚洲在线黄色| 亚洲免费黄色| 久久人人看视频| 欧美在线首页| 欧美日韩在线不卡| 亚洲二区视频在线| 好看的亚洲午夜视频在线| 99热在这里有精品免费| 亚洲第一主播视频| 欧美一区二区三区在线视频| 亚洲图片激情小说| 欧美国产日韩视频| 欧美**字幕| 狠狠色狠狠色综合日日小说| 亚洲午夜黄色| 午夜亚洲性色视频| 欧美日韩在线播放三区| 欧美电影免费观看网站| 国产日韩在线视频| 亚洲特级毛片| 亚洲一区二区精品| 欧美精品三级| 亚洲欧洲另类| 亚洲九九精品| 你懂的网址国产 欧美| 久久综合久久久久88| 国产综合在线看| 欧美中文字幕第一页| 性久久久久久| 国产日韩精品一区二区三区| 亚洲一区二区精品在线| 亚洲女爱视频在线| 国产精品美女久久久久av超清| 99精品视频免费在线观看| 一区二区精品在线观看| 欧美视频在线观看| 亚洲网站视频| 欧美在线黄色| 国产女主播一区二区| 欧美伊人影院| 欧美成人资源网| 亚洲免费观看视频| 国产精品高潮呻吟久久| 午夜精品久久久久久久久久久久久 | 亚洲电影激情视频网站| 亚洲美女黄色| 欧美日韩情趣电影| 亚洲——在线| 美女主播精品视频一二三四| 亚洲七七久久综合桃花剧情介绍| 欧美福利专区| 一区二区三区四区五区视频| 性做久久久久久免费观看欧美| 国内精品模特av私拍在线观看| 免费在线看一区| 亚洲桃色在线一区| 麻豆精品视频在线| 99亚洲一区二区| 国产精品美女久久久久aⅴ国产馆| 亚洲欧美日韩精品久久久久| 久久色在线播放| 亚洲麻豆国产自偷在线| 国产精品你懂的| 美女尤物久久精品| 国产精品99久久久久久久久| 久久综合狠狠综合久久激情| 一本一本久久| 极品少妇一区二区三区| 欧美日韩三级| 久久男女视频| 这里只有精品电影| 欧美wwwwww| 欧美一区二区女人| 最新日韩精品| 国产亚洲精品久久久| 欧美高清不卡| 欧美中文在线字幕| 99这里只有久久精品视频| 久久久久久久91| 正在播放亚洲| 亚洲大胆人体视频| 亚洲欧美日韩高清| 久久精品欧洲| 在线免费观看一区二区三区| 欧美激情2020午夜免费观看| 亚洲字幕在线观看| 亚洲国产国产亚洲一二三| 亚洲一区二区三区视频播放| 国产一区二区三区奇米久涩| 欧美精品久久久久久久久久| 欧美在线观看一区| 日韩午夜中文字幕| 欧美成人精品在线播放| 欧美一区二区高清在线观看| 一区二区三区www| 亚洲国产成人久久综合一区| 国产免费成人| 欧美无乱码久久久免费午夜一区| 榴莲视频成人在线观看| 欧美在线网址| 亚洲在线免费视频| 亚洲精品视频在线| 欧美成在线观看| 久久久夜色精品亚洲| 亚洲欧美日韩一区二区| 99精品国产一区二区青青牛奶| 在线日韩成人| 影音欧美亚洲| 极品av少妇一区二区| 国产精品天天摸av网| 欧美视频一区在线观看| 欧美日韩精品一区二区在线播放 | 在线精品亚洲| 国内精品久久久久久久影视麻豆 | 亚洲一区二区精品在线观看| 91久久亚洲| 亚洲日本中文字幕免费在线不卡| 欧美激情一区二区三区不卡| 欧美成人免费全部| 欧美激情久久久| 亚洲国产一区二区三区在线播 | 久久国产精品第一页| 欧美中文字幕在线观看| 欧美自拍偷拍| 另类专区欧美制服同性| 欧美va亚洲va日韩∨a综合色| 久久艳片www.17c.com| 免费av成人在线| 欧美激情第8页| 欧美日本不卡高清| 欧美性jizz18性欧美| 国产精品欧美日韩| 国产在线视频欧美| 亚洲国产成人久久综合一区| 日韩午夜在线视频| 亚洲女人av| 久久综合成人精品亚洲另类欧美 | 欧美一区二区在线看| 久久久久99| 欧美精品日韩一本| 国产精品女主播| 伊人成年综合电影网|