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

            eryar

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

            OpenCASCADE Conic to BSpline Curves-Hyperbola

            Posted on 2014-10-07 15:34 eryar 閱讀(1934) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenCASCADE Conic to BSpline Curves-Hyperbola

            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. The key point of Hyperbola conversion is to calculate the 2nd pole and its weight factor. The paper focus on the hyperbola convert to the BSpline curves.

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

            1. Introduction

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

            圓錐截線(Conic curves)是一個(gè)平面與一個(gè)圓錐相交產(chǎn)生的曲線集合。平面與圓錐相交的角度不同產(chǎn)生不同的截線。如下圖所示:

            wps_clip_image-32039

            Figure 1.1 Conic Sections

            OpenCASCADE中對(duì)應(yīng)雙曲線的隱式方程表示的類是gp_Hypr/gp_Hypr2d。本文主要介紹OpenCASCADE中如何使用包Convert將gp_Parab2d轉(zhuǎn)換為NURBS曲線。

            2. Parametric Representations

            在CAD/CAM的應(yīng)用中,圓錐截線有兩種重要的參數(shù)表示形式:有理形式和最大內(nèi)接面積形式(Rational and maximum inscribed area forms)。表示雙曲線的最大內(nèi)接面積形式,如下所示:

            wps_clip_image-4803

            其中chu和shu為雙曲函數(shù):

            wps_clip_image-26872

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

            假設(shè)C(u)=(x(u), y(u))是一條在標(biāo)準(zhǔn)位置的圓錐截線的參數(shù)表示?,F(xiàn)在我們對(duì)雙曲線給出的參數(shù)方程也是上式,它是一個(gè)好的參數(shù)化:對(duì)于任意給定的整數(shù)n和參數(shù)邊界a與b,取n個(gè)等間隔分布的參數(shù):

            wps_clip_image-2029

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

            3. Conversion Algorithm

            將隱式表示的雙曲線方程轉(zhuǎn)換為NURBS(有理Bezier是NURBS的特例)曲線需要確定NURBS的以下信息:節(jié)點(diǎn)矢量,權(quán)因子,次數(shù),控制頂點(diǎn)。

            圓錐截線是二次曲線,所以次數(shù)為2。根據(jù)參數(shù)方程的最大內(nèi)接面積表示法可以求出節(jié)點(diǎn)矢量。所以轉(zhuǎn)換的關(guān)鍵是計(jì)算控制第二個(gè)頂點(diǎn)及其權(quán)因子。由有理Bezier曲線的公式得二次有理Bezier曲線弧的表示形式為:

            wps_clip_image-21063

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

            wps_clip_image-6588

            可以證明同一組控制頂點(diǎn)選取不同 的權(quán)因子,只要形狀因子k相等,則由它們決定的二次有理Bezier曲線是同一條曲線段,不同的權(quán)因?qū)?yīng)不同的參數(shù)化,而且可以根據(jù)形狀不變因子對(duì)二次曲線進(jìn)行分類:

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

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

            v K=1;       表示拋物線;

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

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

            習(xí)慣上我們選擇ω0=ω2=1稱為標(biāo)準(zhǔn)參數(shù)化。此時(shí)只剩下控制頂點(diǎn)P1的權(quán)因子ω1。

            wps_clip_image-15168

            Figure 3.1 不同的權(quán)因子ω1 定義的圓錐截線

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

            由端點(diǎn)處的切矢公式可知,控制多邊形通過首末端點(diǎn)且第二個(gè)控制頂點(diǎn)P1是通過兩端點(diǎn)的切線的交點(diǎn)。根據(jù)直接線點(diǎn)向式可以列出直線方程來求出交點(diǎn)即P1點(diǎn)的坐標(biāo)。

            wps_clip_image-27834

            計(jì)算得交點(diǎn)P1的坐標(biāo)如下所示:

            wps_clip_image-23851

            根據(jù)雙曲線的參數(shù)方程得:

            wps_clip_image-26726

            將上述值代入交點(diǎn)坐標(biāo)公式得交點(diǎn)P1的坐標(biāo)與參數(shù)u的關(guān)系式為:

            wps_clip_image-12159

            根據(jù)肩點(diǎn)公式及點(diǎn)P1,可計(jì)算出權(quán)因子的ω1值,公式如下所示:

            wps_clip_image-25736

            求得P1點(diǎn)對(duì)應(yīng)的權(quán)因子ω1的值為:

            wps_clip_image-6240

            至此,雙曲線的三個(gè)控制頂點(diǎn)P0,P1,P2都已計(jì)算出來了。即雙曲線的NURBS表示所需的數(shù)據(jù)都已經(jīng)得到了。下面看看OpenCASCADE中的實(shí)現(xiàn)代碼。

            4. Code Analysis

            OpenCASCADE的Math工具集中有個(gè)包Covert用來將圓錐曲線曲面轉(zhuǎn)換為NURBS曲線曲面。其中轉(zhuǎn)換雙曲線的類為:Convert_HyperbolaToBSplineCurve,實(shí)現(xiàn)代碼如下所示:

             

            //=======================================================================
            //function : Convert_HyperbolaToBSplineCurve
            //purpose  : 
            //=======================================================================

            Convert_HyperbolaToBSplineCurve::Convert_HyperbolaToBSplineCurve 
              (
            const gp_Hypr2d&    H , 
               
            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);
              
              nbPoles 
            = 3;
              nbKnots 
            = 2;
              isperiodic 
            = Standard_False;
              knots
            ->ChangeArray1()(1= UF;  mults->ChangeArray1()(1= 3;  
              knots
            ->ChangeArray1()(2= UL;  mults->ChangeArray1()(2= 3;  
              
              
            // construction of hyperbola in the reference xOy.
              
              Standard_Real R 
            = H.MajorRadius();
              Standard_Real r 
            = H.MinorRadius();
              gp_Dir2d Ox 
            = H.Axis().XDirection();
              gp_Dir2d Oy 
            = H.Axis().YDirection();
              Standard_Real S 
            = ( Ox.X() * Oy.Y() - Ox.Y() * Oy.X() > 0.) ?  1 : -1;
              
              
            // poles expressed in the reference mark
              
            // the 2nd pole is at the intersection of 2 tangents to the curve
              
            // at points P(UF), P(UL)
              
            // the weight of this pole is equal to : Cosh((UL-UF)/2)

              weights
            ->ChangeArray1()(1= 1.;
              weights
            ->ChangeArray1()(2= Cosh((UL-UF)/2);
              weights
            ->ChangeArray1()(3= 1.;

              Standard_Real delta 
            = Sinh(UL-UF);
              Standard_Real x 
            =     R * ( Sinh(UL) - Sinh(UF)) / delta;
              Standard_Real y 
            = S * r * ( Cosh(UL) - Cosh(UF)) / delta;
              poles
            ->ChangeArray1()(1= gp_Pnt2d( R * Cosh(UF), S * r * Sinh(UF));
              poles
            ->ChangeArray1()(2= gp_Pnt2d( x, y);
              poles
            ->ChangeArray1()(3= gp_Pnt2d( R * Cosh(UL), S * r * Sinh(UL));

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

            由上面的代碼可知,先設(shè)置曲線次數(shù)為2,再設(shè)置節(jié)點(diǎn)矢量為[UF,UF,UF,UL,UL,UL],即首參數(shù)UF和末參數(shù)UL的重?cái)?shù)皆為3,由節(jié)點(diǎn)矢量可知轉(zhuǎn)換后的NURBS曲線為Bezier曲線。(拋出異常的提示信息還沒改過來,還是拋物線的。)

            設(shè)置三個(gè)控制頂點(diǎn)及其對(duì)應(yīng)的權(quán)因子,計(jì)算主要涉及到第二個(gè)控制頂點(diǎn)P1的權(quán)因子。

            最后根據(jù)有理Bezier曲線的仿射不變性:對(duì)有理Bezier曲線進(jìn)行旋轉(zhuǎn)、平移和縮放變換,其表達(dá)式不變,只是控制點(diǎn)發(fā)生了改變。新的控制點(diǎn)可以通過對(duì)原控制點(diǎn)作變換得到。即要對(duì)有理Bezier曲線進(jìn)行仿射變換,只需對(duì)其控制點(diǎn)作變換即可。

            圓錐截線的轉(zhuǎn)換類的使用是很簡單的,且計(jì)算都是在構(gòu)造函數(shù)中完成。下面給出一個(gè)將雙曲線轉(zhuǎn)換為NURBS曲線的具體示例來說明其用法。

             

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

            #define WNT
            #include 
            <gp_Hypr2d.hxx>

            #include 
            <Convert_HyperbolaToBSplineCurve.hxx>

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


            void DumpConvertorInfo(const Convert_ConicToBSplineCurve &theConvertor)
            {
                std::cout 
            << "Degree: " << theConvertor.Degree() << std::endl;

                std::cout 
            << "Poles/Weights: " << std::endl;
                
            for (Standard_Integer i = 1; i <= theConvertor.NbPoles(); ++i)
                {
                    
            const gp_Pnt2d &aPole = theConvertor.Pole(i);

                    std::cout 
            << i << "" << aPole.X() << "" << aPole.Y() << " w(" << theConvertor.Weight(i) << ")" << std::endl;
                }

                std::cout 
            << "Knots: " << std::endl;
                
            for (Standard_Integer j = 1, m = 0; j <= theConvertor.NbKnots(); ++j)
                {
                    
            for (Standard_Integer k = 1; k <= theConvertor.Multiplicity(j); ++k)
                    {
                        std::cout 
            << ++<< "" << theConvertor.Knot(j) << std::endl;
                    }
                }

                std::cout 
            << "==========================================" << std::endl;
            }

            void TestHyperbolaConvert(void)
            {
                gp_Hypr2d aHyperbola;

                aHyperbola.SetMajorRadius(
            2.0);
                aHyperbola.SetMinorRadius(
            1.0);

                Convert_HyperbolaToBSplineCurve aConvertor(aHyperbola, 
            1.0, M_PI);

                std::cout 
            << "Convert Hyperbola to BSpline Curve: " << std::endl;
                DumpConvertorInfo(aConvertor);
            }

            int main(int argc, char* argv[])
            {
                TestHyperbolaConvert();

                
            return 0;
            }

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

            wps_clip_image-28203

            Figure 4.1 Convert Hyperbola to BSpline Curve result

            5. Conclusion

            NURBS的一個(gè)優(yōu)勢就是統(tǒng)一了曲線曲面的表示方法,即不僅可以表示自由曲線曲面,還可精確表示圓錐曲線曲面。本文詳細(xì)介紹了OpenCASCADE中將雙曲線轉(zhuǎn)換為NURBS的算法:即根據(jù)二次有理Bezier曲線的端點(diǎn)性質(zhì),求出過兩個(gè)端點(diǎn)切線的交點(diǎn)來計(jì)算出第二個(gè)控制頂點(diǎn)P1進(jìn)而計(jì)算出對(duì)應(yīng)的權(quán)因子。

            計(jì)算中大量使用到了雙曲函數(shù)shx和chx的一些性質(zhì),相關(guān)公式可參考《數(shù)學(xué)手冊(cè)》。

            6. References

            1. 人民教育出版社中學(xué)數(shù)學(xué)室. 數(shù)學(xué)第二冊(cè)(上). 人民教育出版社. 2000

            2. 數(shù)學(xué)手冊(cè)編寫組. 數(shù)學(xué)手冊(cè). 高等教育出版社. 1979

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

            4. 王仁宏,李崇君,朱春鋼. 計(jì)算幾何教程. 科學(xué)出版社. 2008

            久久久婷婷五月亚洲97号色 | 国产99久久九九精品无码| 东京热TOKYO综合久久精品| 国产美女久久久| 噜噜噜色噜噜噜久久| 国产精品免费福利久久| 久久国产成人亚洲精品影院| 少妇熟女久久综合网色欲| 久久99国产综合精品免费| 精品视频久久久久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 欧美久久一区二区三区| 久久香综合精品久久伊人| 久久激情亚洲精品无码?V| 色婷婷综合久久久中文字幕| 国产亚洲色婷婷久久99精品91| 久久久久久精品成人免费图片| 久久久91精品国产一区二区三区| 久久久久高潮综合影院| 久久久久人妻一区精品| 久久久青草青青亚洲国产免观| 2021久久精品免费观看| 精品综合久久久久久88小说| 久久精品99久久香蕉国产色戒| 欧美亚洲国产精品久久| 国产亚州精品女人久久久久久 | 久久午夜无码鲁丝片午夜精品| 久久九九精品99国产精品| 无码八A片人妻少妇久久| 国产呻吟久久久久久久92| 999久久久免费国产精品播放| 久久精品人人做人人爽电影蜜月 | 97r久久精品国产99国产精| 久久精品国产亚洲AV久| 亚洲国产天堂久久综合| 麻豆久久| 99精品久久久久久久婷婷| 精品国产乱码久久久久软件| 狠狠色丁香婷婷久久综合| 久久无码AV一区二区三区| 伊色综合久久之综合久久|