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

eryar

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

Two analytical 2d line intersection in OpenCASCADE

Posted on 2017-02-25 23:05 eryar 閱讀(1721) 評論(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

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

wpsB8A9.tmp

在OpenCASCADE中也有類似的數(shù)據(jù)結(jié)構(gòu)來表示幾何體。本文先來學(xué)習(xí)最簡單的一種求交:兩條二維直線的相交。

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 計算兩條直線的系數(shù);

v 計算系數(shù)方程組。

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

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());
}

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

wpsB8CA.tmp

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

wpsB8CB.tmp

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

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

wpsB8CC.tmp

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

4.Conclusion

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

對于實數(shù)的比較應(yīng)該盡量采用領(lǐng)域比較技術(shù),而避免直接使用兩個數(shù)相等==或不相等!=的判斷。

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

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

5.References

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

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

3. 錢能. C++程序設(shè)計教程. 清華大學(xué)出版社. 2005

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

5. 潘金貴等譯. 算法導(dǎo)論. 機械工業(yè)出版社. 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>
            亚洲自拍都市欧美小说| 亚洲精选久久| 欧美国产先锋| 欧美成人日韩| 欧美好吊妞视频| 快播亚洲色图| 欧美成人自拍| 欧美午夜精品一区| 欧美午夜在线一二页| 欧美午夜精品久久久久久超碰| 国产精品女人毛片| 国产啪精品视频| 精品成人在线| 亚洲国产一区二区三区高清| 99国产精品99久久久久久粉嫩| 亚洲视频一区二区| 久久久精品动漫| 欧美成人自拍视频| 日韩视频精品在线观看| 亚洲激情视频在线观看| 亚洲国产欧美一区二区三区同亚洲 | 午夜精品一区二区在线观看| 亚洲欧美综合| 乱人伦精品视频在线观看| 欧美激情国产日韩| 国产欧美精品久久| 亚洲国产欧美不卡在线观看| 亚洲欧美国产精品桃花| 免费欧美高清视频| 亚洲视频欧洲视频| 麻豆久久婷婷| 国内成人精品2018免费看| 亚洲特级片在线| 欧美国产在线电影| 欧美一级专区| 国产精品久久久久av免费| 亚洲第一伊人| 欧美在线播放高清精品| 最新成人av网站| 一区二区免费在线播放| 久久久久久久久伊人| 国产精品中文字幕在线观看| 妖精视频成人观看www| 久热re这里精品视频在线6| 亚洲校园激情| 欧美三级不卡| 一本色道久久综合亚洲精品不卡 | 91久久精品一区| 性欧美xxxx大乳国产app| 欧美激情网站在线观看| 伊人天天综合| 久久大香伊蕉在人线观看热2| 亚洲精品乱码久久久久| 久久先锋影音av| 国产亚洲午夜高清国产拍精品| 亚洲一区二区成人在线观看| 亚洲国产日韩一区二区| 欧美不卡视频一区| 亚洲精品久久久一区二区三区| 久久久噜噜噜久久中文字免| 午夜精品久久久久久久久久久久久| 欧美日韩免费观看一区三区| 亚洲精品一品区二品区三品区| 另类成人小视频在线| 亚洲欧美综合一区| 国产精品午夜视频| 久久国产精品色婷婷| 99国产一区二区三精品乱码| 欧美大色视频| av成人免费| 欧美电影免费观看高清| 久久久999成人| 国外视频精品毛片| 亚洲国产欧美精品| 亚洲高清色综合| 久久人人爽人人爽爽久久| 在线观看亚洲精品| 欧美国产大片| 欧美日韩天天操| 亚洲视频日本| 亚洲综合精品自拍| 国产久一道中文一区| 欧美在线观看网站| 午夜在线a亚洲v天堂网2018| 韩国美女久久| 老牛嫩草一区二区三区日本| 鲁大师成人一区二区三区| 日韩亚洲欧美成人一区| 亚洲人成欧美中文字幕| 欧美日韩性视频在线| 欧美一区网站| 久久在线精品| 一区二区三区欧美激情| 亚洲欧美日韩国产一区二区| 国产亚洲精品bt天堂精选| 欧美 日韩 国产在线| 欧美精品电影| 久久精品麻豆| 欧美另类视频在线| 久久精品久久99精品久久| 欧美高清视频一二三区| 欧美中文字幕精品| 欧美国产日韩xxxxx| 欧美在线国产精品| 欧美高清在线一区二区| 久久丁香综合五月国产三级网站| 欧美黑人多人双交| 欧美电影免费观看高清完整版| 一区二区三区精品| 久久gogo国模裸体人体| 亚洲激情一区| 欧美亚洲三区| 日韩视频精品| 久久免费高清视频| 亚洲一区黄色| 欧美国产日韩一区| 美国成人毛片| 国产精品美女午夜av| 91久久中文字幕| 亚洲第一精品福利| 性亚洲最疯狂xxxx高清| 亚洲视频专区在线| 欧美成人激情在线| 久久久福利视频| 国产精品视频第一区| 亚洲国产婷婷香蕉久久久久久| 极品少妇一区二区三区| 一区二区三区色| 亚洲精品在线视频| 久热精品视频| 欧美国产日本| 一区视频在线看| 久久精品国产免费观看| 欧美一级黄色网| 国产精品色在线| 99视频一区二区三区| 一区二区三区产品免费精品久久75| 99热免费精品| 中文日韩在线视频| 欧美成人精品影院| 欧美不卡在线视频| 在线观看日韩av| 久久综合色播五月| 久久久久久久网站| 国产视频一区二区在线观看| 亚洲社区在线观看| 欧美一区二区三区四区视频| 国产精品国产三级国产普通话蜜臀| 在线性视频日韩欧美| 亚洲一区在线播放| 国产视频欧美视频| 欧美一区二区高清| 久久免费视频观看| 韩国av一区| 免费不卡欧美自拍视频| 亚洲国产精品va在看黑人| 一本色道久久综合亚洲二区三区| 久久久天天操| 亚洲人成绝费网站色www| 一区二区日韩欧美| 国产欧美日韩三级| 久久精品国产一区二区三区免费看| 麻豆久久精品| 日韩一本二本av| 国产欧美精品xxxx另类| 久久精品在线观看| 亚洲国产你懂的| 午夜精品久久一牛影视| 激情久久久久久久久久久久久久久久 | 亚洲免费高清视频| 国产精品日本欧美一区二区三区| 亚洲欧美日韩一区二区三区在线| 蜜桃久久精品一区二区| 亚洲精品乱码| 国产午夜精品理论片a级大结局 | 亚洲人成人77777线观看| 欧美日韩亚洲三区| 午夜国产精品视频免费体验区| 美日韩精品免费观看视频| 亚洲日本成人| 国产精品综合视频| 免费成人高清在线视频| 亚洲天堂偷拍| 欧美国产综合视频| 久久国产精品99国产| 在线精品视频一区二区| 国产精品视频不卡| 欧美高清视频一区| 久久中文字幕导航| 亚洲一区二区综合| 日韩视频二区| 亚洲丁香婷深爱综合| 久久综合国产精品台湾中文娱乐网| 亚洲精品五月天| 在线国产精品播放| 国产精品―色哟哟| 欧美午夜无遮挡| 欧美黄色小视频| 欧美成人精品1314www| 久久激情五月丁香伊人|