簡體   English   中英

線段搜索的最佳數據結構是什么?

[英]What is the best datastructure for line segments searching?

我需要一個數據結構來查找所有落入矩形的段(在C#中,即使這不是主要問題)。

例如,段[[0,0),(10,10)]必須位於以(5,5)開始且大小為(1,1)的矩形中。

我嘗試了kdtree,但是當他的點之一恰好在矩形中時,它只返回段。 它不會將線段視為連續線。

我需要哪種數據結構才能有效地進行此搜索?
我進行了搜索,但對於這種情況沒有找到任何東西,即使它看起來很標准!

問題維度:矩形中有6000個線段,平均20個線段

重復的種類:

對於非點對象(線段不是點對象), R樹可能比kd樹更適合。 如果線段數量較少(<50),則將它們存儲在矢量中並始終對其進行測試可能是最快的方法。

我不知道您遇到的問題的標准算法,但是我想到的第一個想法是將矩形表示為4條線,並且如果您有很多線段-找到所有線段和線的交點(通過對線段和線,然后“合並”其坐標)。
因此它是N * log(N)+ M * Log(M),其中N-線段數,M-平方數。

之后,您可以找到與正方形相交的線段為(SquareHorizLine1Intersections UNION SquareHorizLine2Intersections)INTERSECT(SquareVerticalLine1Intersections UNION SquareVerticalLine2Intersections)

同樣,集合的交集和單位的復雜度為K * LogK,其中K為集合的大小。 如果使用數據結構“ Binomial堆”(甚至還有Fibonacci堆,則效率甚至更高),甚至可以簡單地使用log(K)。

因此,該算法看起來具有N * log(N)復雜度。 希望對您有所幫助...或者您需要更好的選擇?

您可以嘗試將延長線段參數化為(y截距,斜率)或類似參數。 與給定線段相交的延長線空間在(y截距,斜率)空間中形成一個形狀,您可以查詢該形狀,就好像這些線是點一樣。 (在特殊情況下,請處理垂直線。)

將與rect的任何邊界線段相交的線的並集,然后濾除未延伸時實際上未與rect交叉的線段。

// we will intersect against three of the rect's borders (the 4th's results are redundant)
borders = {(TopLeft, TopRight), (TopRight, BottomRight), (BottomRight, BottomLeft)}
// each border forms a shape in (y, slope) space defined by two intersecting half spaces
// we query the line space using something standard like kd-trees
lines1 = Union(borders.ForEach(LineSpace.Inside(ShapeOfSegmentInIntersectSpace(?border))))
// now filter out lines that don't cross the rect when extended
// since we already know they intersect when extended, the check is pretty simple
lines2 = lines1.Where(?line.BoundingRect.Intersects(rect))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM