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

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

Posted on 2014-10-07 15:34 eryar 閱讀(1971) 評論(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中有著廣泛應用。毫無疑問NURBS的一個最大優點就是既能精確表示圓錐截線和圓,也能精確表示自由曲線曲面。這個優點的意義是方便編程,使所有的曲線可以采用統一的數據結構來表示。通過有理的方式可以精確來表示這些二次曲線,那么給定一個二次曲線的相關參數(如圓的圓心和半徑等),如何構造出對應的NURBS曲線呢?

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

wps_clip_image-32039

Figure 1.1 Conic Sections

OpenCASCADE中對應雙曲線的隱式方程表示的類是gp_Hypr/gp_Hypr2d。本文主要介紹OpenCASCADE中如何使用包Convert將gp_Parab2d轉換為NURBS曲線。

2. Parametric Representations

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

wps_clip_image-4803

其中chu和shu為雙曲函數:

wps_clip_image-26872

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

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

wps_clip_image-2029

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

3. Conversion Algorithm

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

圓錐截線是二次曲線,所以次數為2。根據參數方程的最大內接面積表示法可以求出節點矢量。所以轉換的關鍵是計算控制第二個頂點及其權因子。由有理Bezier曲線的公式得二次有理Bezier曲線弧的表示形式為:

wps_clip_image-21063

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

wps_clip_image-6588

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

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

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

v K=1;       表示拋物線;

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

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

習慣上我們選擇ω0=ω2=1稱為標準參數化。此時只剩下控制頂點P1的權因子ω1。

wps_clip_image-15168

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

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

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

wps_clip_image-27834

計算得交點P1的坐標如下所示:

wps_clip_image-23851

根據雙曲線的參數方程得:

wps_clip_image-26726

將上述值代入交點坐標公式得交點P1的坐標與參數u的關系式為:

wps_clip_image-12159

根據肩點公式及點P1,可計算出權因子的ω1值,公式如下所示:

wps_clip_image-25736

求得P1點對應的權因子ω1的值為:

wps_clip_image-6240

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

4. Code Analysis

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

 

//=======================================================================
//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);
}

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

設置三個控制頂點及其對應的權因子,計算主要涉及到第二個控制頂點P1的權因子。

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

圓錐截線的轉換類的使用是很簡單的,且計算都是在構造函數中完成。下面給出一個將雙曲線轉換為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;
}

程序輸出結果如下所示:

wps_clip_image-28203

Figure 4.1 Convert Hyperbola to BSpline Curve result

5. Conclusion

NURBS的一個優勢就是統一了曲線曲面的表示方法,即不僅可以表示自由曲線曲面,還可精確表示圓錐曲線曲面。本文詳細介紹了OpenCASCADE中將雙曲線轉換為NURBS的算法:即根據二次有理Bezier曲線的端點性質,求出過兩個端點切線的交點來計算出第二個控制頂點P1進而計算出對應的權因子。

計算中大量使用到了雙曲函數shx和chx的一些性質,相關公式可參考《數學手冊》。

6. References

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

2. 數學手冊編寫組. 數學手冊. 高等教育出版社. 1979

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

4. 王仁宏,李崇君,朱春鋼. 計算幾何教程. 科學出版社. 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>
            久久国产精品99久久久久久老狼 | 亚洲毛片在线观看| 国产视频观看一区| 国产精品一区在线观看你懂的| 国产精品vip| 国产欧美日韩在线| 国外成人免费视频| 亚洲黄色在线| 亚洲视频在线观看网站| 小黄鸭精品aⅴ导航网站入口| 欧美夜福利tv在线| 男人的天堂亚洲在线| 亚洲精品国产品国语在线app| 亚洲精品国产精品乱码不99按摩| 一本久道久久综合中文字幕| 午夜精品久久久久久99热软件 | 国产精品一区二区在线观看| 国产欧美二区| 亚洲国产精品视频一区| 亚洲一级免费视频| 久久夜色精品亚洲噜噜国产mv| 欧美激情日韩| 亚洲欧美另类在线| 欧美巨乳在线观看| 在线观看欧美黄色| 亚洲一区二区三区色| 久久伊人亚洲| 一区二区三区视频在线看| 久久久xxx| 国产精品久久亚洲7777| 亚洲高清在线精品| 久久99在线观看| 亚洲免费观看高清在线观看 | 麻豆精品网站| 国产精品夜色7777狼人| 亚洲欧洲精品一区二区三区不卡| 午夜伦欧美伦电影理论片| 欧美sm重口味系列视频在线观看| 亚洲免费成人av| 蜜臀久久99精品久久久久久9| 国产欧美日韩三级| 亚洲淫性视频| 亚洲国产精品女人久久久| 一区二区三区免费观看| 欧美成人69| 伊人影院久久| 久久婷婷蜜乳一本欲蜜臀| 亚洲一线二线三线久久久| 欧美精品大片| 亚洲人成网站在线观看播放| 久久只精品国产| 午夜国产一区| 国产精品视频自拍| 亚洲欧美综合v| 亚洲视频精品| 欧美午夜精品久久久久久浪潮| 99伊人成综合| 亚洲区一区二| 欧美日韩国产成人高清视频| 亚洲日本免费| 亚洲乱码国产乱码精品精可以看 | 欧美激情bt| 亚洲黄一区二区三区| 免费观看日韩| 理论片一区二区在线| 亚洲国产成人久久综合| 亚洲国产mv| 欧美国产精品日韩| 女人香蕉久久**毛片精品| 亚洲精品欧美日韩专区| 91久久久精品| 欧美日韩精品免费观看| 亚洲欧美一区二区三区在线| 午夜精品国产更新| 一区二区在线视频| 亚洲成色精品| 欧美天天在线| 久久精品官网| 蜜臀久久99精品久久久画质超高清| 亚洲卡通欧美制服中文| 在线视频你懂得一区| 国产午夜精品全部视频播放| 欧美xx视频| 欧美日韩天天操| 久久精品视频在线看| 欧美成人在线免费观看| 亚洲一区二区三区在线视频| 亚洲欧美视频| 亚洲区中文字幕| 亚洲一区二区3| 一区二区亚洲精品国产| 亚洲国产精品成人精品| 国产精品嫩草影院一区二区| 久热精品视频在线观看一区| 欧美精品一区二区三区在线看午夜| 亚洲一区二区日本| 久久久九九九九| 亚洲一区二区三区色| 久久深夜福利| 午夜在线视频观看日韩17c| 久久久久成人精品免费播放动漫| 日韩视频永久免费| 久久国产免费看| 亚洲小说欧美另类婷婷| 久久精品国产亚洲a| 中文亚洲字幕| 蜜臀a∨国产成人精品| 欧美在线free| 欧美日韩一本到| 欧美国产精品va在线观看| 国产欧美日本一区视频| 日韩视频精品在线| 亚洲国产精品va在看黑人| 亚洲男人影院| 亚洲视频一区| 欧美黄色aa电影| 麻豆成人在线观看| 国产欧美一区二区精品性色 | 久久久久久69| 久久不射2019中文字幕| 国产精品hd| 一片黄亚洲嫩模| 日韩一区二区精品在线观看| 久久亚洲私人国产精品va| 久久久久综合| 国产自产在线视频一区| 亚洲自拍16p| 亚洲欧美激情一区| 欧美无乱码久久久免费午夜一区| 亚洲国产精品成人va在线观看| 蜜臀91精品一区二区三区| 久久久久久久尹人综合网亚洲| 国产精品久久久久一区| 亚洲精品国产精品久久清纯直播| 91久久久久久| 欧美成人精品在线播放| 亚洲成色999久久网站| 亚洲人www| 欧美日产在线观看| 一本不卡影院| 午夜精品短视频| 国产免费成人av| 欧美一站二站| 欧美+亚洲+精品+三区| 亚洲二区在线观看| 欧美成人精品不卡视频在线观看| 欧美激情一区在线观看| 亚洲国产小视频| 欧美精品亚洲一区二区在线播放| 亚洲精品亚洲人成人网| 亚洲性线免费观看视频成熟| 国产精品久久婷婷六月丁香| 亚洲一区二区三区精品动漫| 欧美影院视频| 在线精品视频免费观看| 欧美精品亚洲二区| 亚洲午夜电影| 开元免费观看欧美电视剧网站| 亚洲成在人线av| 欧美日韩精品伦理作品在线免费观看| 99这里有精品| 久久久久国产精品一区三寸| 在线观看中文字幕不卡| 欧美日本国产在线| 午夜视频在线观看一区二区三区| 久久夜色精品国产亚洲aⅴ | 欧美成人精品一区二区| 99亚洲精品| 久久一区二区三区av| 亚洲精品一区二区三区蜜桃久| 国产精品v欧美精品v日本精品动漫 | 久久婷婷影院| 欧美肥婆在线| 亚洲在线播放| 伊人久久大香线蕉av超碰演员| 久久精品视频在线观看| 亚洲激情一区二区| 久久久xxx| 中文日韩在线视频| 亚洲国产一区在线| 国产三区精品| 欧美日韩一区二区三区在线观看免 | 亚洲国产日韩在线| 另类天堂视频在线观看| 亚洲一区二区三区精品视频| 亚洲第一页自拍| 欧美在线视频免费观看| 99精品国产一区二区青青牛奶| 国产午夜精品福利| 欧美三级资源在线| 欧美暴力喷水在线| 久久久午夜视频| 欧美在线视屏| 亚洲影视中文字幕| 亚洲日本中文字幕区| 韩国av一区二区三区| 国产精品视频网| 国产精品成人一区| 欧美精品一线| 欧美α欧美αv大片|