求兩個多邊形資料 vtkPolyData 的相交線

2021-07-22 16:46:04 字數 4531 閱讀 2525

vtkintersectionpolydatafilter

【簡介】

該濾波器計算兩個多邊形資料 vtkpolydata 的交集。

其第乙個輸出是 交集線集( a set of lines );

第二個和第三個輸出分別為第一和第二個輸入 vtkpolydata.

如果需要,後兩個輸出可以被相交線分割。

【示例】

可以看出使用是非常簡單的,

【類實現部分】

vtksmartpointerintersectionpolydatafilter =

vtksmartpointer::new();

intersectionpolydatafilter->setinputconnection( 0, spheresource1->getoutputport() );

intersectionpolydatafilter->setinputconnection( 1, spheresource2->getoutputport() );

intersectionpolydatafilter->update();

輸入兩個多邊形資料資訊,呼叫update() 函式就可以得到像個多邊形資料相交的資料資訊:

【類實現過程的分析】

其實內部還有很多東西是可以學習的,接下來就分析一下 這個類的源**:

可以看出該類的基類是 vtkpolydataalgorithm ,所以這個類中最為重要的函式就是 

intrequestdata (vtkinformation *,vtkinformationvector **, vtkinformationvector *)

通過前面文章的分析可以知道,該類呼叫 update()  函式的過程中系統會自動呼叫這個 requestdata() 這個函式。

該類的實現部分:

int vtkintersectionpolydatafilter::requestdata(vtkinformation* vtknotused(request),

vtkinformationvector** inputvector,

vtkinformationvector* outputvector)

if (bounds1[maxidx] > bounds0[maxidx])

}vtksmartpointer< vtkpointlocator > pointmerger = vtksmartpointer< vtkpointlocator >::new();

pointmerger->settolerance(1e-6);

pointmerger->initpointinsertion(outputintersection->getpoints(), bounds0);

impl->pointmerger = pointmerger;

// this performs the ******** intersection search

obbtree0->intersectwithobbtree

(obbtree1, 0, vtkintersectionpolydatafilter::impl::find********intersections,

impl);

// split the first output if so desired

if ( this->splitfirstoutput )

else

// split the second output if desired

if ( this->splitsecondoutput )

else

impl->pointcellids[0]->delete();

impl->pointcellids[1]->delete();

delete impl;

return 1;

}

分析:

對於輸入面的重新三角化的結果:

圖中藍色為相交面,綠色為源資料資訊,紅色為重新三角化後的輸出資料。

【內部分析】

第乙個有趣的地方:

typedef struct _celledgeline  celledgelinetype;

typedef std::multimap< vtkidtype, celledgelinetype > pointedgemaptype;

typedef pointedgemaptype::iterator pointedgemapiteratortype;

根據之後**的分析,我才發現,這個地方主要是為了實現 multimap 的遍歷:
pointedgemaptype    *pointedgemap[2];

pointedgemapiteratortype iterlower =

this->pointedgemap[index]->lower_bound( ptid );

pointedgemapiteratortype iterupper =

this->pointedgemap[index]->upper_bound( ptid );

while (iterlower != iterupper)

++iterlower;

}

(這樣子看,覺得這個挺好的)

第二個有趣的地方:

類的定義出就寫著 private implementation to hide stl.

class vtkintersectionpolydatafilter::impl

;

第乙個公有函式:

int vtkintersectionpolydatafilter::impl

::find********intersections(vtkobbnode *node0, vtkobbnode *node1,

vtkmatrix4x4 *transform, void *arg)

// 判斷當前得到的三角形是不是與 tree1 的 node1 上的三角形相交

// returns true if ******** (optionally transformed) intersects node.

if (obbtree1->********intersectsnode

(node1, tripts0[0], tripts0[1], tripts0[2], transform))

// 判斷是否兩個三角形相交

int coplanar = 0;

double outpt0[3], outpt1[3];

int intersects =

vtkintersectionpolydatafilter::****************intersection

(tripts0[0], tripts0[1], tripts0[2],

tripts1[0], tripts1[1], tripts1[2],

coplanar, outpt0, outpt1);

// 三角形共面 : coplanar = 1

if ( coplanar )

// 兩個三角形相交線,並且線段有長度不相同

if ( intersects &&

( outpt0[0] != outpt1[0] ||

outpt0[1] != outpt1[1] ||

outpt0[2] != outpt1[2] ) )

retval++;}}

}}} }return retval;

}

遍歷兩個樹中某兩個節點中的每個 cell ,呼叫函式 ****************intersection 求出兩個三角形相交的線,相交線段的兩個端點 outpt0, outpt1

我自己覺得比較麻煩的地方就是為了 vtkintersectionpolydatafilter::impl *info 這個變數各種成員屬性的賦值,可能是最近變笨了,所以對於有很多屬性的類有點迷茫,會忘記、混淆。。。

對於vtkidtypearray的操作也不熟

// insert data at a specified position in the array. 

void vtkidtypearray::insertvalue (vtkidtype id, vtkidtype f )

// insert data at the end of the array. return its location in the array.

vtkidtype vtkidtypearray::insertnextvalue (vtkidtype f)

兩個簡單多邊形求交 CGAL

兩個多邊形求交的實現需要幾個模組 cgal中有insect函式,但是必須要求使用cgal exact predicates exact constructions kernel 本人出於其他想法,沒有把基於exact predicates inexact constructions kernel核的...

求兩個多邊形的交面積(模板)

別人的部落格 多邊形的交,多邊形的邊一定是要按逆時針方向給出 還要判斷是凸包還是凹包,呼叫相應的函式 面積並,只要和面積減去交即可 include using namespace std const int maxn 300 const double eps 1e 8 int dcmp double...

python 計算兩個多邊形的IOU

計算兩個多邊形的iou。可以是不同類的多邊形,如乙個矩形和乙個三角形 也可以是兩個同類的多邊形。import cv2 import math from skimage.draw import polygon from skimage.feature import peak local max imp...