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

eryar

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

Two analytical 2d line intersection in OpenCASCADE

Posted on 2017-02-25 23:05 eryar 閱讀(1711) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Two analytical 2d line intersection in OpenCASCADE

eryar@163.com

Abstract. OpenCASCADE geometric tools provide algorithms to calculate the intersection of two 2d curves, surfaces, or a 3d curve and a surface. Those are the basis of the Boolean Operation, so under the implementation can help to under the BO algorithms. The paper focus on the intersection of two 2d analytical line.

Key Words. OpenCASCADE, Line Intersection

1.Introduction

在幾何造型系統中,通常利用集合的并、交、差運算實現復雜形體的構造,而集合運算需要大量的求交運算。如何提高求交的實用性、穩定性、速度和精度等,對幾何造型系統至關重要。當前的幾何造型系統,大多數采用邊界表示法來表示模型。在這種表示法中,形體的邊界元素和某類幾何元素相對應,它們可以是直線、圓弧、二次曲線、Bezier曲線和B樣條曲線等,也可以是平面、球面、二次曲面、Bezier曲面和B樣條曲面等,求交情況十分復雜。在一個典型的幾何造型系統中,用到的幾何元素通常有25種,為了建立一個通用的求交函數庫,所要完成的求交函數多達:

wpsB8A9.tmp

在OpenCASCADE中也有類似的數據結構來表示幾何體。本文先來學習最簡單的一種求交:兩條二維直線的相交。

wpsB8BA.tmp

Figure 1. 2d line intersection

2.Code Usage

OpenCASCADE中計算二維解析曲線的類是IntAna2d_AnaIntersection,可用于計算如下的曲線之間的相交:

v 兩條二維直線;

v 兩個二維圓;

v 二維直線和二維圓;

v 二維直線、圓、橢圓、拋物線、雙曲線二次曲線與另外一條二維曲線;

下面使用OpenCASCADE來對圖1所示的兩條二維直線進行求交計算。代碼如下:

/*
Copyright(C) 2017 Shing Liu(eryar@163.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

// NOTE
// ----
// Tool: Visual Studio 2013 & OpenCASCADE7.1.0
// Date: 2017-02-25  20:52 

#include <gp_Dir2d.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Pnt2d.hxx>

#include <GCE2d_MakeLine.hxx>

#include <IntAna2d_AnaIntersection.hxx>

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

#pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")


void test(void)
{
    GCE2d_MakeLine aLineMaker1(gp_Pnt2d(0.0, 0.0),  gp_Pnt2d(10.0, 10.0));
    GCE2d_MakeLine aLineMaker2(gp_Pnt2d(2.0, 10.0), gp_Pnt2d(12.0, 2.0));

    gp_Lin2d aLine1 = aLineMaker1.Value()->Lin2d();
    gp_Lin2d aLine2 = aLineMaker2.Value()->Lin2d();
    
    IntAna2d_AnaIntersection aIntAna;
    aIntAna.Perform(aLine1, aLine2);
    if (aIntAna.IsDone())
    {
        const IntAna2d_IntPoint& aIntPoint = aIntAna.Point(1);
        std::cout << "Number of IntPoint between the 2 curves: " 
                  << aIntAna.NbPoints() << std::endl;
        std::cout << "Intersect Point: " << aIntPoint.Value().X() 
                  << ", " << aIntPoint.Value().Y() << std::endl;
    }

}

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

    return 0;
}

計算得到交點為(6.44, 6.44):

Number of IntPoint between the 2 curves: 1
Intersect Point: 6.44444, 6.44444
Press any key to continue . . .

3.Code Analysis

計算二維直線相交的代碼在文件IntAna2d_AnaIntersection_1.cxx中,其中名字IntAna2d的意思是Intersection Analytical兩個單詞前三個字母,即二維解析曲線求交包。源碼列出如下:

 

void IntAna2d_AnaIntersection::Perform (const gp_Lin2d& L1,
                    const gp_Lin2d& L2) {

 
  done = Standard_False;

  Standard_Real A1,B1,C1;
  Standard_Real A2,B2,C2;
  L1.Coefficients(A1,B1,C1);
  L2.Coefficients(A2,B2,C2);

  Standard_Real al1,be1,ga1;
  Standard_Real al2,be2,ga2;
  
  Standard_Real Det =Max (Abs(A1),Max(Abs(A2),Max(Abs(B1),Abs(B2))));

  if (Abs(A1)==Det) {
    al1=A1;
    be1=B1;
    ga1=C1;
    al2=A2;
    be2=B2;
    ga2=C2;
  }
  else if (Abs(B1)==Det) {
    al1=B1;
    be1=A1;
    ga1=C1;
    al2=B2;
    be2=A2;
    ga2=C2;
  }
  else if (Abs(A2)==Det) {
    al1=A2;
    be1=B2;
    ga1=C2;
    al2=A1;
    be2=B1;
    ga2=C1;
  }
  else {
    al1=B2;
    be1=A2;
    ga1=C2;
    al2=B1;
    be2=A1;
    ga2=C1;
  }

  Standard_Real rap=al2/al1;
  Standard_Real denom=be2-rap*be1;

  if (Abs(denom)<=RealEpsilon()) {                // Directions confondues
    para=Standard_True;
    nbp=0;
    if (Abs(ga2-rap*ga1)<=RealEpsilon()) {          // Droites confondues
      iden=Standard_True;
      empt=Standard_False;
    }
    else {                                       // Droites paralleles
      iden=Standard_False;
      empt=Standard_True;
    }
  }
  else {
    para=Standard_False;
    iden=Standard_False;
    empt=Standard_False;
    nbp=1;
    Standard_Real XS = (be1*ga2/al1-be2*ga1/al1)/denom;
    Standard_Real YS = (rap*ga1-ga2)/denom;

    if (((Abs(A1)!=Det)&&(Abs(B1)==Det))||
    ((Abs(A1)!=Det)&&(Abs(B1)!=Det)&&(Abs(A2)!=Det))) {
      Standard_Real temp=XS;
      XS=YS;
      YS=temp;
    }

    Standard_Real La,Mu;
    if (Abs(A1)>=Abs(B1)) {
      La=(YS-L1.Location().Y())/A1;
    }
    else {
      La=(L1.Location().X()-XS)/B1;
    }
    if (Abs(A2)>=Abs(B2)) {
      Mu=(YS-L2.Location().Y())/A2;
    }
    else {
      Mu=(L2.Location().X()-XS)/B2;
    }
    lpnt[0].SetValue(XS,YS,La,Mu);
  }
  done=Standard_True;
}

從上述源碼中可以看出,OpenCASCADE對二維直線求交計算使用的是解方程組的方法。步驟如下:

v 計算兩條直線的系數;

v 計算系數方程組。

這些都是高中數學知識了,就當復習下,并由此看出OpenCASCADE中的一些編碼風格。先看第一步,根據點和方向計算二維直線的系數,相關的源碼如下所示:

inline void gp_Lin2d::Coefficients (Standard_Real& A,
    Standard_Real& B,
    Standard_Real& C) const
{
  A =   pos.Direction().Y();
  B = - pos.Direction().X();
  C = -(A * pos.Location().X() + B * pos.Location().Y());
}

由高中數學可知,二維直線的方程有三種形式:點斜式、兩點式和一般式。

wpsB8CA.tmp

根據一般式方程,當B不等于0時,可得:

wpsB8CB.tmp

因為OpenCASCADE中的gp_Dir2d是單位向量,所以可將其X、Y值分別對應-B和A。確定A和B后,再根據一般式方程將C移項得到:C=-Ax-By

得到直線的系數后,交點的計算就變成如下方程組的求解了:

wpsB8CC.tmp

OpenCASCADE的源碼中有多個條件判斷,相當于高期消元法中的選主元操作,主要是為了避免分母為0的情況。其中有兩個實數直接判斷相等的語句,如Abs(A1)==Det這種。對于實數大小的比較,一般總是使用兩者相減的值是否落在0的領域中來判斷。OpenCASCADE中對于實數的比較沒有采用領域比較技術,顯得不夠嚴謹。其實領域比較的方法已經在Precison.hxx中進行了說明,只是有些代碼沒有嚴格執行。

4.Conclusion

通過對OpenCASCADE中二維直線相交代碼的分析,理解其實現原理:將點向式的直線轉換成一般式,再對一般式聯立方程求解。求解過程中使用了高期消元法的選主元方法。

對于實數的比較應該盡量采用領域比較技術,而避免直接使用兩個數相等==或不相等!=的判斷。

如果只是判斷兩條直線是否相交,而不用計算交點的話,《算法導論》中有使用向量來高效算法。

因為二維直線相交只涉及到高中數學知識,所以本文是拋磚引玉,通過繼續學習,理解B樣條曲線的相交算法實現。

5.References

1. 孫家廣, 胡事民. 計算機圖形學基礎. 清華大學出版社. 2009

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

3. 錢能. C++程序設計教程. 清華大學出版社. 2005

4. 易大義, 沈云寶, 李有法. 計算方法. 浙江大學出版社. 2002

5. 潘金貴等譯. 算法導論. 機械工業出版社. 2011

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日本中文| 欧美一区二区网站| 欧美另类在线播放| 欧美精品日韩www.p站| 欧美国产精品va在线观看| 欧美成人午夜激情| 欧美日韩第一区| 国产精品女人毛片| 国产一区二区三区四区hd| 狠狠色狠狠色综合系列| 在线不卡免费欧美| 在线观看日韩av| 日韩一级成人av| 午夜在线精品| 猛干欧美女孩| 亚洲美女视频网| 亚洲欧美影音先锋| 久久先锋资源| 欧美日韩综合一区| 韩国在线一区| 亚洲天堂av在线免费| 久久精品国产99精品国产亚洲性色| 免费av成人在线| 夜夜嗨av一区二区三区网站四季av | 久久婷婷人人澡人人喊人人爽| 久久亚洲视频| 亚洲全部视频| 在线亚洲伦理| 美女精品国产| 国内久久婷婷综合| 在线午夜精品| 欧美aⅴ99久久黑人专区| 99精品国产在热久久婷婷| 久久久xxx| 国产精品自拍小视频| 一区二区三区高清不卡| 久久久久一区二区三区四区| 亚洲黄色在线| 久久久久久网| 国产视频精品免费播放| 一区二区日韩伦理片| 美女精品一区| 欧美一区三区三区高中清蜜桃| 欧美日韩国产高清| 亚洲激情第一页| 久久综合久久综合九色| 午夜影院日韩| 国产欧美另类| 性欧美暴力猛交69hd| 日韩午夜视频在线观看| 免费观看在线综合| 亚洲国产福利在线| 久久欧美中文字幕| 欧美在线观看日本一区| 一本色道久久| 欧美日韩综合视频网址| 一区二区三区日韩精品| 亚洲精品国久久99热| 欧美激情精品久久久| 亚洲精品国产精品国自产在线 | 久久经典综合| 亚洲综合国产激情另类一区| 欧美性色aⅴ视频一区日韩精品| 日韩视频专区| 日韩亚洲欧美精品| 欧美午夜免费| 午夜精品久久久久久久99热浪潮| 一本一本久久a久久精品综合麻豆| 欧美日韩国产在线| 亚洲香蕉在线观看| 亚洲图片欧美午夜| 国产亚洲欧美一区在线观看| 欧美一区二区三区四区夜夜大片 | 久热re这里精品视频在线6| 久久成人国产| 亚洲国产日韩精品| 91久久久在线| 欧美视频日韩视频在线观看| 亚洲欧美日韩国产成人精品影院| 亚洲综合色在线| 一区在线播放| 亚洲三级性片| 国产精品一区视频网站| 久久在线视频在线| 欧美激情二区三区| 性亚洲最疯狂xxxx高清| 久久久激情视频| 一本色道久久99精品综合| 亚洲一级在线| 亚洲国产精品久久久久婷婷老年| 亚洲麻豆视频| 国产在线视频欧美一区二区三区| 亚洲成色999久久网站| 国产精品国产三级国产aⅴ9色| 久久久精品五月天| 欧美人与性动交a欧美精品| 新片速递亚洲合集欧美合集| 久久综合网色—综合色88| 亚洲视频一二三| 久久精品官网| 制服丝袜激情欧洲亚洲| 久久精品人人做人人爽电影蜜月| 99re6这里只有精品视频在线观看| 亚洲一区国产一区| 亚洲美女中出| 久久精品国产亚洲一区二区三区| 一区二区91| 麻豆精品视频在线观看| 欧美在线首页| 欧美视频中文一区二区三区在线观看 | 久久精品72免费观看| 亚洲精品中文字| 欧美亚洲视频一区二区| 一本色道久久综合亚洲精品按摩| 欧美专区在线播放| 亚洲一区二区在线播放| 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久精品欧美| 欧美一区二视频| 欧美黑人在线观看| 久久尤物电影视频在线观看| 国产精品一区二区视频| 亚洲精品之草原avav久久| 在线欧美小视频| 欧美在线观看一区二区| 亚洲欧美日韩一区二区在线 | 欧美乱在线观看| 欧美激情一区二区三区四区| 精品成人国产在线观看男人呻吟| 亚洲永久免费精品| 亚洲免费视频一区二区| 欧美日韩精品二区| 亚洲精品一区二区在线观看| 亚洲欧洲综合| 欧美黄色小视频| 91久久精品一区| 99综合在线| 欧美日韩精品综合在线| 亚洲精品在线看| 亚洲一区二区精品在线| 欧美午夜剧场| 亚洲欧美日韩国产中文在线| 性18欧美另类| 激情校园亚洲| 麻豆精品在线观看| 亚洲国语精品自产拍在线观看| 亚洲人成在线观看| 欧美精品videossex性护士| 亚洲日韩第九十九页| 亚洲午夜精品福利| 国产精品自拍一区| 久久综合九色综合欧美狠狠| 亚洲第一综合天堂另类专| 日韩视频不卡| 国产精品免费观看在线| 欧美在线在线| 欧美岛国激情| 一区二区三区精品国产| 国产精品一区二区在线观看网站 | 一区在线视频观看| 美女露胸一区二区三区| 亚洲日韩视频| 欧美在线高清| 亚洲国产精品一区二区第一页| 欧美激情一区二区三区成人| 亚洲视频久久| 老司机一区二区三区| 亚洲免费电影在线| 欧美一区二区三区免费视| 久久激情五月丁香伊人| 亚洲区国产区| 国产精品视频一| 蜜乳av另类精品一区二区| 国产精品99久久久久久久久| 久久久久国产精品一区二区| 亚洲人在线视频| 国产精品一级在线| 久久综合五月| 亚洲欧美电影院| 91久久国产综合久久| 久久精彩免费视频| 一区二区三区日韩欧美精品| 国产视频亚洲精品| 欧美日本韩国在线| 久久精品一区二区| 在线一区二区视频| 欧美国产另类| 久久国产精彩视频| 亚洲小视频在线| 亚洲欧洲精品一区二区精品久久久| 国产精品你懂得| 欧美日韩大片| 欧美成人亚洲成人日韩成人| 欧美在线短视频| 宅男在线国产精品| 亚洲日本激情| 亚洲国产精品久久| 毛片一区二区| 久久视频一区二区| 久久精品人人做人人综合|