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

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>
            亚洲精品久久久久久久久久久| 欧美一区成人| 久久久噜噜噜久噜久久| 香蕉久久国产| 国内自拍亚洲| 久久香蕉国产线看观看av| 亚洲精品日韩激情在线电影| 另类天堂av| 亚洲精品免费电影| 亚洲最新视频在线播放| 国产精品theporn| 亚洲小说春色综合另类电影| 亚洲少妇诱惑| 国产视频在线观看一区二区三区| 亚洲一区二区在线免费观看| 午夜精品久久久久影视 | 欧美1区免费| 久久青青草综合| 亚洲国产欧美在线| 一区二区三区日韩欧美| 国产精品成人在线观看| 午夜日韩在线观看| 久久综合久久久久88| 亚洲欧洲综合另类在线| 久久免费视频网站| 欧美激情1区2区| 性欧美video另类hd性玩具| 免费在线看一区| 国产精品成人观看视频免费| 欧美中文在线视频| 久久国产精品久久久| 亚洲精品视频免费| 亚洲欧美经典视频| 日韩亚洲欧美一区二区三区| 亚洲欧美中文字幕| 亚洲青涩在线| 久久福利一区| 亚洲无线观看| 久久久综合免费视频| 性亚洲最疯狂xxxx高清| 久久久免费精品视频| 亚洲欧美一区二区精品久久久| 久久久久久久尹人综合网亚洲 | 亚洲欧美国产精品专区久久| 另类欧美日韩国产在线| 欧美激情一区二区三区在线视频| 欧美国产视频在线| 久久久噜噜噜久久| 国产精品日韩一区二区| 亚洲国产精品成人久久综合一区 | 亚洲九九精品| 一区免费视频| 亚洲欧美日韩中文在线制服| 亚洲特色特黄| 免费高清在线视频一区·| 日韩亚洲在线| 欧美激情一二三区| 麻豆91精品| 国产精品盗摄久久久| 亚洲韩国精品一区| 亚洲电影第1页| 久久国产免费| 久久精品国产清自在天天线| 欧美三日本三级三级在线播放| 亚洲人成网站777色婷婷| 在线观看日韩精品| 久久成人18免费网站| 午夜激情综合网| 久久婷婷亚洲| 欧美gay视频| 激情一区二区三区| 亚洲欧美成人网| 亚洲美女中文字幕| 欧美日韩播放| 一本久久青青| 欧美一区二区三区喷汁尤物| 国产精品美腿一区在线看| 一区二区三区黄色| 久久精品日产第一区二区| 国产午夜精品全部视频播放| 91久久在线| 亚洲一区二区三区四区中文| 欧美日韩黄色大片| 亚洲天堂男人| 久久精彩免费视频| 国产自产高清不卡| 欧美大片在线看免费观看| 亚洲高清不卡| 精品福利免费观看| 欧美激情在线狂野欧美精品| 亚洲人成在线播放网站岛国| 亚洲自拍三区| 国产一区二区日韩| 久久xxxx| 亚洲精品欧美在线| 亚洲资源在线观看| 国产精品久久久久国产精品日日| 欧美一区二区三区免费观看| 免费观看在线综合| 99精品久久久| 国产日韩欧美在线播放| 久久嫩草精品久久久久| 亚洲美女黄网| 久久精品亚洲一区二区三区浴池| 国产精品夫妻自拍| 美女露胸一区二区三区| 日韩视频永久免费观看| 久久综合久久久久88| 99在线视频精品| 国产欧美在线看| 欧美日韩高清不卡| 午夜精品福利视频| 国产午夜精品视频| 狠狠色伊人亚洲综合成人| 欧美国产日韩精品免费观看| 日韩一区二区免费看| 亚洲欧美另类综合偷拍| 亚洲黄色在线视频| 国产精品自在欧美一区| 欧美激情乱人伦| 性做久久久久久久免费看| 亚洲国产高清aⅴ视频| 久久精品国产欧美激情| 99热在这里有精品免费| 欧美涩涩网站| 欧美日本乱大交xxxxx| 欧美一区二区高清| 亚洲在线一区二区| 亚洲精品国产精品乱码不99按摩 | 欧美电影免费观看高清| 亚洲尤物在线视频观看| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲激情专区| 国产欧美1区2区3区| 国产精品xxxav免费视频| 久久久综合精品| 午夜精品美女自拍福到在线 | 欧美一区二区播放| 亚洲婷婷综合色高清在线| 国产一区av在线| 国产偷久久久精品专区| 国产精品久久久对白| 欧美成年人网站| 美日韩精品视频| 久久久久久久久久久久久9999| 久久久91精品国产| 性8sex亚洲区入口| 亚洲精品国产精品国产自| 亚洲国内在线| 亚洲国产小视频在线观看| 亚洲国产精品123| 欧美国产精品| 久色婷婷小香蕉久久| 免费av成人在线| 蜜桃精品久久久久久久免费影院| 麻豆精品在线视频| 麻豆成人综合网| 欧美国产日韩一区二区| 亚洲肉体裸体xxxx137| 亚洲国产色一区| 亚洲理论在线观看| 亚洲视频图片小说| 亚洲欧美日韩国产一区二区三区| 欧美在线视频一区二区| 久久精品国产亚洲一区二区| 亚洲综合精品自拍| 欧美在线首页| 久久成人资源| 欧美日韩视频在线一区二区观看视频| 欧美人妖在线观看| 久久深夜福利免费观看| 麻豆九一精品爱看视频在线观看免费| 久久婷婷国产综合精品青草| 欧美bbbxxxxx| 国产精品a久久久久久| 国产欧美在线观看一区| 亚洲国产成人精品女人久久久| 亚洲国产专区校园欧美| 亚洲影院在线观看| 久久久青草婷婷精品综合日韩| 欧美1区2区3区| 亚洲五月婷婷| 免费观看一区| 一本色道久久综合狠狠躁篇怎么玩 | 免费在线一区二区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲毛片在线免费观看| 香蕉视频成人在线观看| 欧美一区午夜精品| 欧美激情亚洲国产| 国产视频不卡| 亚洲美女在线观看| 欧美影院精品一区| 亚洲国产精品成人一区二区| 亚洲一级免费视频| 性色av一区二区三区| 欧美精品一区二区三区久久久竹菊| 国产精品乱码| 亚洲一级片在线观看| 欧美不卡视频一区|