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

eryar

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

性能提升-空間二叉查找樹

Posted on 2023-08-06 18:53 eryar 閱讀(722) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

性能提升-空間二叉查找樹

eryar@163.com

Abstract.  OpenCASCADE provides NCollection_UBTree to achieve high performance search overlapped boxes. The algorithm of unbalanced binary tree of overlapped bounding boxes. Once the tree of boxes  of geometric objects is constructed, the algorithm is capable of fast geometric selection of objects.  The tree can be easily updated by adding to it a new object with bounding box. The time of adding to the tree  of one object is O(log(N)), where N is the total number of  objects, so the time  of building a tree of  N objects is O(N(log(N)). The search time of one object is O(log(N)). Defining  various classes  inheriting NCollection_UBTree::Selector  we can perform various kinds of selection over the same b-tree object.

Key Words. Unbalanced Binary Tree, Binary Search Tree, Binary Sort Tree, Bounding Box

1 Introduction

非平衡二叉樹(Unbalanced Binary Tree)又叫二叉查找樹(Binary Search Tree)或二叉排序樹(Binary Sort Tree)。它的定義很簡單,就是左子樹上所有節(jié)點的值都要小于根節(jié)點上的值。右子樹上所有節(jié)點值都要大于根節(jié)點上的值。在二叉查找樹上執(zhí)行操作時間與樹的高度成正比。對于一棵含有n個結(jié)點的完全二叉樹,這些操作的最壞情況運(yùn)行時間為O(lg(n))。但是如果樹是含n個結(jié)點的線性鏈,則這些操作的最壞的情況運(yùn)行時間為O(n)。一棵隨機(jī)構(gòu)造的二叉查找樹的期望高度為O(lg(n)),從而這種樹上操作的平均時間為O(lg(n))。

幾何搜索(geometry searching)大致分兩類:一類是區(qū)域搜索問題(range searching problem),另一類是點的定位問題(point location problem)。區(qū)域搜索問題要回答的是給定一個區(qū)域,看有多少模型屬于這個區(qū)域。當(dāng)然,我們可以對所有模型進(jìn)行遍歷,這種算法時間復(fù)雜度為O(N),效率不高。常見的高效的區(qū)域搜索算法有k-D樹,k-D樹就是一種多維的平衡二叉樹。還有比較常見的KNN問題,這些都是計算幾何處理的問題。

OpenCASCADE中提供一種空間查找二叉樹算法NCollection_UBTree,字面意思是非平衡二叉樹Unbalanced Binary Tree。把上圖中的數(shù)字換成包圍盒,構(gòu)造二叉查找樹。為了解決查找二叉樹單鏈問題,加入隨機(jī)處理,可以使查找性能達(dá)到O(log(N)),相對普通遍歷速度而言還是不錯的。本文結(jié)合示例代碼說明如何使用這個非平衡二叉樹。

2 Example

在OpenCASCADE中有多個函數(shù)來實現(xiàn)將很多無序邊Edges連接成Wire,需要查詢一條邊Edge的一個頂點Vertex在一定精度范圍內(nèi)相連的頂點Vertex有哪些?

首先,實現(xiàn)一個選擇類,通過選擇類來進(jìn)行過濾:

typedef NCollection_UBTree<Standard_Integer, Bnd_Box> BoxTree;
typedef NCollection_UBTreeFiller<Standard_Integer, Bnd_Box> BoxTreeFiller;
class BoxSelector : public BoxTree::Selector
{
public:
    BoxSelector(const TColgp_SequenceOfPnt& thePoints, Standard_Real theTolerance)
        : Selector()
        , myPoints(thePoints)
        , myTolerance(theTolerance)
    {
    }
    virtual Standard_Boolean Reject(const Bnd_Box& theBox) const
    {
        return theBox.IsOut(myBox);
    }
    virtual Standard_Boolean Accept(const Standard_Integer& theIndex)
    {
        if (theIndex > myPoints.Size() || theIndex == myIndex)
        {
            return Standard_False;
        }
        const gp_Pnt& aPnt = myPoints.Value(theIndex);
        if (aPnt.SquareDistance(myPnt) < myTolerance)
        {
            myResultIndex.Append(theIndex);
            return Standard_True;
        }
        return Standard_False;
    }
    void SetCurrentPoint(const gp_Pnt& thePnt, Standard_Integer theIndex)
    {
        myPnt = thePnt;
        myBox.Add(thePnt);
        myIndex = theIndex;
    }
    const TColStd_ListOfInteger& GetResultIndex() const
    {
        return myResultIndex;
    }
    void ClearResultIndex()
    {
        myResultIndex.Clear();
    }
protected:
private:
    const TColgp_SequenceOfPnt& myPoints;
    gp_Pnt myPnt;
    Bnd_Box myBox;
    Standard_Integer myIndex;
    Standard_Real myTolerance;
    TColStd_ListOfInteger myResultIndex;
};

主要實現(xiàn)兩個抽象函數(shù)Reject()和Accept(),以及設(shè)置當(dāng)前選擇器的狀態(tài)。Reject()函數(shù)用來判斷要查找的Box與當(dāng)前空間范圍的狀態(tài),如果在外,則返回True。當(dāng)兩個Box有相交時,會調(diào)用Accept()函數(shù),在此函數(shù)中判斷兩個點的距離是否在容差范圍內(nèi),若在容差范圍內(nèi),則將點記錄起來。主函數(shù)main代碼如下:

int main(int argc, char* argv[])
{
    // Fill tree with random points.
    BoxTree aBoxTree;
    BoxTreeFiller aTreeFiler(aBoxTree);
    math_BullardGenerator aRandom;
    TColgp_SequenceOfPnt aPoints;
    for (Standard_Integer i = 1; i <= 100; ++i)
    {
        gp_Pnt aPnt(aRandom.NextReal(), aRandom.NextReal(), aRandom.NextReal());
        aPoints.Append(aPnt);
        Bnd_Box aBox;
        aBox.Add(aPnt);
        aTreeFiler.Add(i, aBox);
    }
    aTreeFiler.Fill();
    // Query points near the given point.
    BoxSelector aSelector(aPoints, 0.1);
    for (Standard_Integer i = aPoints.Lower(); i <= aPoints.Upper(); ++i)
    {
        const gp_Pnt& aPnt = aPoints.Value(i);
        aSelector.SetCurrentPoint(aPnt, i);
        Standard_Integer aSize = aBoxTree.Select(aSelector);
        if (aSize > 0)
        {
            std::cout << "Search Point : " << aPnt.X() << " \t " << aPnt.Y() << " \t " << aPnt.Z() << std::endl;
            const TColStd_ListOfInteger& aResult = aSelector.GetResultIndex();
            for (TColStd_ListOfInteger::Iterator aIt(aResult); aIt.More(); aIt.Next())
            {
                const gp_Pnt& aPoint = aPoints.Value(aIt.Value());
                std::cout << "Target Point : " << aPoint.X() << " \t " << aPoint.Y() << " \t " << aPoint.Z() << std::endl;
            }
            std::cout << "=============================" << std::endl;
        }
        aSelector.ClearResultIndex();
    }
    return 0;
}

先用隨機(jī)函數(shù)隨機(jī)生成100個點,并將點通過BoxTreeFiller添加到查找樹aBoxTree中,調(diào)用Fill函數(shù)構(gòu)造查找樹。

再使用類BoxSelector來進(jìn)行快速查找,查找之前先設(shè)置當(dāng)前點及包圍盒。然后調(diào)用aBoxTree.Select(aSelector)進(jìn)行查找。

3 Conclusion

類NCollection_UBTree通過構(gòu)造包圍盒的非平衡二叉樹來加快區(qū)域搜索速度。如何提高搜索速度,是計算幾何處理的范疇。在OpenCASCADE中這個類使用場景比較多,如將無序邊構(gòu)造成Wire時都用這個類:BRepLib_MakeWire::Add(const TopTools_ListOfShape& L), ShapeAnalysis_FreeBounds::ConnectEdgesToWires()。包括后面引入的BVH都是為了提高搜索速度,在合適的場景中多使用這些算法,會對程序性能的提升有很大幫助。

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久国产香蕉| 国产精品久久久久久妇女6080| 亚洲自拍偷拍网址| 欧美一区二区三区另类| 亚洲高清不卡| 99精品国产在热久久婷婷| 国产九九精品| 欧美成人免费播放| 欧美涩涩网站| 久久亚洲私人国产精品va| 欧美~级网站不卡| 亚洲欧美日韩精品久久| 久久久亚洲人| 亚洲永久精品国产| 久久久久久亚洲综合影院红桃| 亚洲精品国久久99热| 亚洲女人小视频在线观看| 在线欧美小视频| 一本色道久久综合精品竹菊| 国产夜色精品一区二区av| 亚洲国产日韩欧美在线图片| 国产欧美在线视频| 亚洲国产成人久久| 国产婷婷色综合av蜜臀av| 亚洲日本va在线观看| 国内免费精品永久在线视频| 亚洲精品国产视频| 国产一级一区二区| 一区二区高清在线观看| 亚洲电影专区| 久久成人国产| 午夜精品短视频| 欧美久色视频| 欧美成人中文字幕| 国产三级精品在线不卡| 一本色道久久加勒比精品| 亚洲电影免费观看高清完整版在线| 一区二区三区回区在观看免费视频| 在线播放日韩欧美| 欧美在线黄色| 欧美一区国产二区| 国产精品xxxav免费视频| 亚洲黄网站在线观看| 在线免费观看日本一区| 欧美一区二区三区在线| 午夜精品久久久久久久久久久| 欧美久久久久中文字幕| 亚洲国产精品一区二区尤物区| 激情小说另类小说亚洲欧美| 小黄鸭视频精品导航| 午夜性色一区二区三区免费视频| 欧美日韩国内| 亚洲伦理一区| 亚洲视频你懂的| 欧美视频精品在线观看| 99re热这里只有精品免费视频| 亚洲精品一区二区在线| 欧美成人精品激情在线观看| 欧美激情一区二区久久久| 在线免费观看日本一区| 美日韩免费视频| 亚洲经典视频在线观看| aⅴ色国产欧美| 欧美三级在线视频| 亚洲性线免费观看视频成熟| 欧美一区网站| 国内视频精品| 嫩模写真一区二区三区三州| 亚洲国产日韩欧美| 亚洲视频一区二区| 国产乱码精品一区二区三| 午夜影视日本亚洲欧洲精品| 久久综合九色| 亚洲伦理久久| 国产精品国产三级国产专区53| 亚洲综合二区| 欧美 日韩 国产在线| 99视频一区二区三区| 国产精品国色综合久久| 久久国产精品久久精品国产| 欧美大片国产精品| 一区二区三区成人精品| 国产精品腿扒开做爽爽爽挤奶网站| 欧美一区91| 欧美大片在线观看| 亚洲一卡久久| 激情综合视频| 欧美日韩国产不卡| 欧美一区免费视频| 亚洲精品日韩在线| 久久精品主播| 一区二区欧美在线| 国内精品美女av在线播放| 欧美极品一区二区三区| 午夜久久影院| 亚洲乱码久久| 另类春色校园亚洲| 亚洲在线观看免费| 亚洲国产二区| 国产精品一区三区| 免费亚洲电影在线| 欧美一区二视频| 亚洲免费观看高清在线观看| 久久综合给合| 欧美一激情一区二区三区| 亚洲精品中文字幕在线| 国产一区二区三区黄视频| 欧美日韩不卡视频| 久久综合五月| 性视频1819p久久| 一区二区久久久久久| 亚洲福利视频网| 久久在线免费视频| 欧美一区二区网站| 亚洲欧美在线观看| 在线一区二区视频| 亚洲精品视频在线看| 在线日韩一区二区| 国产在线成人| 国产亚洲福利| 国产欧美日韩激情| 国产精品亚洲综合一区在线观看| 欧美日本簧片| 欧美黄网免费在线观看| 免费欧美在线| 麻豆成人91精品二区三区| 欧美在线综合| 欧美在线视频免费播放| 亚洲欧美综合v| 亚洲欧美日韩国产| 午夜精品福利一区二区蜜股av| 亚洲私人影院在线观看| 一本色道久久88综合日韩精品| 亚洲看片网站| 99成人在线| 在线亚洲伦理| 亚洲午夜精品一区二区| 亚洲午夜电影在线观看| 亚洲图片你懂的| 亚洲一区中文| 午夜精品久久久久99热蜜桃导演| 亚洲性夜色噜噜噜7777| 亚洲欧美日韩精品久久| 欧美一区二区三区在线观看视频| 午夜国产精品视频| 久久久免费精品视频| 老司机精品视频网站| 欧美二区不卡| 欧美视频久久| 国产婷婷色一区二区三区| 伊人色综合久久天天| 最新亚洲视频| 亚洲校园激情| 久久国内精品自在自线400部| 久久久久久亚洲精品杨幂换脸| 久久深夜福利| 亚洲激情一区| 亚洲一区久久久| 久久久久久9999| 欧美黄网免费在线观看| 国产精品日韩欧美一区二区三区| 国产色综合久久| 亚洲经典三级| 午夜精品久久一牛影视| 久久综合伊人77777麻豆| 亚洲人成啪啪网站| 午夜精品国产更新| 欧美激情va永久在线播放| 国产精品久久午夜| 亚洲国产日韩欧美一区二区三区| av成人天堂| 久久伊人免费视频| 亚洲看片免费| 久久久久久久综合狠狠综合| 欧美日韩视频在线一区二区 | 久久综合给合久久狠狠色| 欧美交受高潮1| 国产在线欧美日韩| 中文网丁香综合网| 免费欧美视频| 亚洲男人第一av网站| 欧美精品福利在线| 国产在线拍揄自揄视频不卡99| 99这里只有久久精品视频| 久久久99爱| 亚洲桃花岛网站| 欧美国产日韩一区二区在线观看| 国产乱肥老妇国产一区二| av不卡免费看| 亚洲国产91色在线| 久久亚洲一区| 国产亚洲aⅴaaaaaa毛片| 亚洲一区二区三区视频| 亚洲国产专区校园欧美|