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

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 閱讀(1968) 評論(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的一個最大優(yōu)點就是既能精確表示圓錐截線和圓,也能精確表示自由曲線曲面。這個優(yōu)點的意義是方便編程,使所有的曲線可以采用統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)來表示。通過有理的方式可以精確來表示這些二次曲線,那么給定一個二次曲線的相關(guān)參數(shù)(如圓的圓心和半徑等),如何構(gòu)造出對應(yīng)的NURBS曲線呢?

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

wps_clip_image-32039

Figure 1.1 Conic Sections

OpenCASCADE中對應(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ù)值對應(yīng)于曲線上分布很不均勻的點。利用線性有理函數(shù)對有理曲線進(jìn)行重新參數(shù)化可以改變(因而可能改善)其參數(shù)化。

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

wps_clip_image-2029

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

3. Conversion Algorithm

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

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

wps_clip_image-21063

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

wps_clip_image-6588

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

v K=0;       表示退化的二次曲線:一對直線段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ù)化。此時只剩下控制頂點P1的權(quán)因子ω1。

wps_clip_image-15168

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

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

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

wps_clip_image-27834

計算得交點P1的坐標(biāo)如下所示:

wps_clip_image-23851

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

wps_clip_image-26726

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

wps_clip_image-12159

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

wps_clip_image-25736

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

wps_clip_image-6240

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

4. Code Analysis

OpenCASCADE的Math工具集中有個包Covert用來將圓錐曲線曲面轉(zhuǎn)換為NURBS曲線曲面。其中轉(zhuǎn)換雙曲線的類為:Convert_HyperbolaToBSplineCurve,實現(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é)點矢量為[UF,UF,UF,UL,UL,UL],即首參數(shù)UF和末參數(shù)UL的重數(shù)皆為3,由節(jié)點矢量可知轉(zhuǎn)換后的NURBS曲線為Bezier曲線。(拋出異常的提示信息還沒改過來,還是拋物線的。)

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

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

圓錐截線的轉(zhuǎn)換類的使用是很簡單的,且計算都是在構(gòu)造函數(shù)中完成。下面給出一個將雙曲線轉(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的一個優(yōu)勢就是統(tǒng)一了曲線曲面的表示方法,即不僅可以表示自由曲線曲面,還可精確表示圓錐曲線曲面。本文詳細(xì)介紹了OpenCASCADE中將雙曲線轉(zhuǎn)換為NURBS的算法:即根據(jù)二次有理Bezier曲線的端點性質(zhì),求出過兩個端點切線的交點來計算出第二個控制頂點P1進(jìn)而計算出對應(yīng)的權(quán)因子。

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

6. References

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩综合久久| 亚洲韩国青草视频| 国产在线观看精品一区二区三区| 欧美精品日韩| 欧美日韩一二区| 欧美亚日韩国产aⅴ精品中极品| 欧美日韩国产限制| 国产精品美女久久| 国产资源精品在线观看| 亚洲黄色三级| 亚洲一区尤物| 久久亚洲春色中文字幕| 亚洲激情成人| 亚洲欧美在线网| 久久一二三四| 国产精品久久国产三级国电话系列| 国产伦精品一区二区三区免费 | 久久国产精品99国产精| 久久综合一区二区| 国产精品久久久久aaaa九色| 国模精品一区二区三区| 一级日韩一区在线观看| 欧美在线观看天堂一区二区三区| 欧美14一18处毛片| 亚洲永久网站| 欧美片第一页| 在线观看日韩精品| 欧美一区二区三区免费视| 亚洲激情欧美| 久久久噜噜噜久久| 国产欧美精品一区| 一本久道综合久久精品| 免费h精品视频在线播放| 亚洲一区二区在线免费观看视频| 欧美大尺度在线观看| 美女久久一区| 欧美中文日韩| 日韩亚洲欧美综合| 免费一级欧美在线大片| 国产一区二区高清不卡| 亚洲视频一区二区| 亚洲国产91色在线| 久久久精品一区二区三区| 欧美午夜精品久久久久久久| 亚洲精品中文字| 免费日韩av| 久久久精品免费视频| 国产毛片久久| 欧美一级大片在线免费观看| 一本到12不卡视频在线dvd| 欧美精品免费看| 亚洲精品综合精品自拍| 欧美黑人多人双交| 老司机一区二区三区| 在线国产亚洲欧美| 欧美成人精品影院| 久久综合伊人77777麻豆| 好吊日精品视频| 久久漫画官网| 久久综合给合| 亚洲人成网站在线播| 亚洲成色最大综合在线| 欧美成人精品在线| av成人黄色| 夜夜精品视频| 国产免费成人在线视频| 久久久久国产精品一区二区| 久久精品国产欧美激情| 在线观看亚洲精品| 亚洲成色精品| 欧美日韩亚洲一区二区三区在线| 亚洲无线观看| 午夜精品亚洲| 亚洲电影av在线| 亚洲欧洲日产国产网站| 欧美日韩在线免费视频| 欧美一区二区免费| 久久久www免费人成黑人精品 | 亚洲欧美电影院| 国产日产欧产精品推荐色| 久久久综合网| 欧美激情精品久久久久久变态| 一区二区日韩精品| 亚洲欧美中文字幕| 亚洲精品日韩在线| 亚洲淫片在线视频| 91久久精品www人人做人人爽| 亚洲精品在线三区| 国产真实乱偷精品视频免| 亚洲国产欧美日韩精品| 国产精品一区二区久久国产| 欧美aa在线视频| 国产精品激情| 亚洲电影观看| 欧美日韩在线视频观看| 欧美精品久久久久久久免费观看| 亚洲一区二区成人在线观看| 性欧美办公室18xxxxhd| 亚洲开发第一视频在线播放| 亚洲欧美日本国产有色| 亚洲美女诱惑| 午夜精品久久久久久| 亚洲片区在线| 久久超碰97人人做人人爱| 中日韩视频在线观看| 久久先锋影音| 欧美专区在线播放| 欧美日韩在线播放| 欧美高清视频在线播放| 国产欧美日韩综合一区在线观看| 亚洲国产网站| 亚洲成人中文| 久久国产精品色婷婷| 亚洲欧美日韩高清| 欧美日韩一区成人| 亚洲国产91| 91久久亚洲| 老**午夜毛片一区二区三区| 久久精品国产亚洲高清剧情介绍| 欧美三级乱码| 亚洲精品一品区二品区三品区| 亚洲国产一区二区三区在线播| 欧美中文在线视频| 久久se精品一区精品二区| 国产精品盗摄一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品毛片a∨一区二区三区| 亚洲国产精品久久久久秋霞不卡 | 欧美mv日韩mv国产网站| 国产日韩精品久久| 亚洲欧美在线磁力| 久久疯狂做爰流白浆xx| 国产精品中文在线| 亚洲一区视频在线观看视频| 亚洲免费在线视频| 国产精品美女主播在线观看纯欲| 在线视频欧美日韩精品| 亚洲一区二区三区中文字幕| 国产精品久久久久久av下载红粉| 一本色道久久加勒比88综合| 亚洲一区二区三区免费视频| 国产精品www.| 亚洲欧美日韩精品综合在线观看| 欧美在线亚洲| 国产一区二区三区在线观看免费视频| 亚洲影院高清在线| 久久蜜桃精品| 亚洲国产天堂久久综合| 欧美sm视频| av成人手机在线| 欧美在线999| 亚洲电影av在线| 国产精品日韩精品| 国产精品九九久久久久久久| 亚洲先锋成人| 久久青草久久| 亚洲精品乱码久久久久久久久 | 性欧美暴力猛交69hd| 久久精品在这里| 最新高清无码专区| 欧美午夜精品久久久| 欧美在线日韩精品| 91久久久久久久久| 久久xxxx| 亚洲精品自在久久| 国产精品区一区二区三| 久久天天躁夜夜躁狠狠躁2022 | 久久精品久久综合| 亚洲国产婷婷香蕉久久久久久99 | 亚洲精品在线观看免费| 欧美性开放视频| 久久久国产精品亚洲一区 | 久久精品日产第一区二区| 亚洲国产精品久久久久| 香蕉成人久久| 亚洲伦理在线免费看| 国产欧美精品一区二区三区介绍 | 午夜精品久久久久久久| 1204国产成人精品视频| 国产精品高潮呻吟| 女人天堂亚洲aⅴ在线观看| 亚洲在线观看免费| 亚洲清纯自拍| 美脚丝袜一区二区三区在线观看| 亚洲一区日本| 最近中文字幕日韩精品| 国产深夜精品| 国产精品免费观看视频| 欧美激情综合色| 久久久久久久久久久久久9999| 9人人澡人人爽人人精品| 欧美激情欧美激情在线五月| 久久精品中文字幕免费mv| 亚洲伊人伊色伊影伊综合网| 亚洲精品日日夜夜| 亚洲高清影视| 黄色国产精品一区二区三区| 国产精品一级二级三级| 欧美性天天影院| 欧美性猛交xxxx乱大交退制版|