2016-02-23 173 views
3

我有一個QPainterPath可以容納任何序列的行和/或三次貝塞爾曲線。現在,我有一個QPoint,我需要計算QPainterPath和點之間的最短距離。由於路徑本身不會比存儲元素的順序更多,因此我將它們添加到路徑中,但它本身不提供此類功能。我唯一的想法是使用QPainterPath::toFillPolygon()構造一個多邊形,但是這有時會返回一個等於路徑的多邊形,有時會返回一個空的多邊形。此外,QPolygonF對象只是一個點的列表,其中一些連接線,其中一些沒有連接在原始路徑,但我無法找出它們中哪些連接,哪些不連接。QPainterPath和QPoint之間的最短距離

是否有任何(簡單)解決方案來計算QPainterPath(最好不轉換爲多邊形)和QPoint之間的最短距離?

+0

重複問題在http://www.qtcentre.org/threads/31451-How-to-find-the-nearest-point-on-a-QPainterPath,但沒有一個解決方案(簡單或其他)。 – eclarkso

+0

@eclarkso:引用答案並在此處作出答案。 –

+1

@DieterLücking由於eclarkso寫道,在這些問題中沒有答案(至少他鏈接的一個,我發現使用搜索引擎) – msrd0

回答

1

QPainterPathpointAtPercent()因此您可以在給定步驟迭代路徑並檢查位於路徑上的多個點與目標點之間的距離。

這會給你大致的最短距離,如果你想要更高的精度,你可以把重點放在路徑的這些段上,並在更精細的一步迭代。

+0

謝謝,這種方法絕對很好的近似距離,雖然我想有一個確切的解決方案。如果沒有更好的解決方案,我將使用該解決方案 – msrd0

+0

如果它是一條直線或一條弧線,則可以精確計算它,但是如果您有貝塞爾曲線,則無論採用哪種方式,都將使用線段進行近似。 – dtech

+0

我知道,我不喜歡用線條來得到多邊形的方式,但是你也可以得到一條貝塞爾曲線的函數,雖然我認爲我知道這是一個5多項式解決方案,你想解決... – msrd0