給定一條直線和一條二次貝塞爾曲線的點,如何計算它們的最近點?如何計算線條和曲線的最近點? ..或曲線和曲線?
回答
我只是想給你一些提示,在案例Q.B.Curve //段: 得到一個足夠快的計算,我想你應該首先考慮爲你的算法使用一種'邊界框'。 說P0是QB曲線,P2與第二點,P1的控制點,和P3P4線段然後的第一點:從P0
- 計算距離,P1,P2到P3P4
- 如果P0 OR P2是最近點 - >這是來自P3P4曲線的最近點。結束:=)。
- 如果P1是最近點,並且Pi(i = 0或1)是第二個最近點,PiPC和P3P4之間的距離是您尋求的距離的估計值,可能根據您的需要足夠精確。
- 如果您需要更精確:計算P1',這是Q.B.曲線上離P1最近的點:您發現它應用了t = 0.5的BQC公式。 - >距離PiP1'到P3P4的距離是一個更準確的估計 - 但成本更高 - 。
- 請注意,如果由P1P1'定義的線與P3P4相交,則P1'是距P3P4最近的QBC點。
- 如果P1P1' 不相交P3P4,那麼你的運氣了,你必須去艱難地...
現在,如果(當),你需要精度:
思考使用曲線參數上的分治算法: 它離P3P4最近? P0P1'或P1'P2如果它是P0P1'→t在0和0.5之間,那麼計算P = t = 0.25。 現在哪個離P3P4最近? P0Pm或PmP1'?如果是PmP1' - >在t = 0.25 + 0.125 = 0.375時計算Pm2,那麼哪個最接近? PmPm2或Pm2P1'等等 你會很快找到準確的解決方案,就像6次迭代,你的t精度爲0.004!當兩點之間的距離變得低於給定值時,您可能會停止搜索。 (而不是區別兩個參數,因爲參數稍微改變,點可能很遠)實際上,該算法的原理是每次更精確地近似曲線段。首先使用段/段計算,然後(可能)段/曲線計算,並且只有在需要曲線/曲線計算的時候,才能避免無用的計算。
對於曲線/曲線,分而治之也是一個很難解釋的問題,但是您可能會發現它。 :=)
希望你能找到你的速度/準確性這個良好的平衡:=)
編輯:想我找到了,一般情況下,一個很好的解決方案:-) 你應該重複的(內)每個BQC的邊界三角形 所以我們有三角形T1,點A,B,C有't'參數tA,tB,tC。 和三角形T2,點D,E,F,具有t參數tD,tE,tF。 最初我們有tA = 0 tB = 0.5 tC = 1.0,對於T2 tD = 0,tE = 0.5,tF = 1.0也是一樣的想法是遞歸地調用一個過程,將T1和/或T2分成更小的矩形,直到我們對於達到的精度是可以的。 第一步是計算從T2到T1的距離,並跟蹤每個三角形上距離最近的線段。第一個「技巧」:如果在T1上線段爲AC,則在T1上停止遞歸性,曲線1上的最近點是A或C.如果在T2上最近線段是DF,則停止T2上的遞歸性,曲線2是D或F.如果我們停止遞歸 - >返回距離= min(AD,AF,CD,CF)。那麼如果我們在T1上有遞歸性,並且AB段最近,那麼新的T1變成:A'= AB = tB =(tA + tC)/ 2 = 0.25的曲線1的點,C =在新的T1和新的T2上應用遞歸性,並調用相同的算法。當在T1和T2之間發現的距離減去在先前的T1和T2之間發現的距離低於閾值時停止算法。 函數可能看起來像ComputeDistance(curveParam1,A,C,shouldSplitCurve1,curveParam2,D,F,shouldSplitCurve2,previousDistance),其中點也存儲它們的t參數。
請注意,距離(曲線,段)只是該算法的特定情況,並且您應該實現距離(三角形,三角形)和距離(段,三角形)以使其有效。玩的開心。
的地步,有正常人的比賽是他們最近點。我的意思是你畫一條與該線正交的線。如果該線與曲線正交,則交點爲最近點
對於例子1,4,5和8不適用,因爲曲線在那裏被切斷。此外,這是一個必要的條件,但並不充分,因爲*最遠的點也將具有正交的正態分佈。 – thiton
1.簡單的方法 - 通過迭代從第一條曲線開始逐點並從第二條曲線開始,然後得到最小值 2 。確定曲線之間距離的數學函數和此函數的計算極限:
| Fcur1(t)-Fcur2(t)| - > 0
Fs是矢量。
我認爲,我們可以計算出本作確定的極值,並得到最近和farest點
我想想這一段時間後,產後全響應的衍生物。
存在着關於從INRIA這個問題上的科學論文:Computing the minimum distance between two Bézier curves(PDF here)
有趣,但這可能是一對二次Bézier曲線的矯枉過正,對於二次Bézier曲線和一條線來說,肯定是矯枉過正。 –
也許它是過度的,但很難找到,現在它變得更容易:D –
制定你的問題的標準分析方面:你已經有了一個數量減少(距離),所以你制定這樣的一個公式數量並找到一階導數爲零的點。通過使用曲線的參數p
,使用單個參數進行參數化,該參數在第一點0和最後一點1之間。
在線情況下,該方程非常簡單:從樣條線方程中獲取x/y座標,並通過向量方程計算與給定線的距離(標量乘以線的法線)。
在曲線的情況下,解析解可能會變得非常複雜。您可能想要使用數字最小化技術,例如Nelder-Mead,或者,因爲您有一維連續問題,簡單的二分法。
我曾經寫過一個工具來完成類似的任務。貝塞爾樣條一般是參數三次多項式。爲了計算立方段和線之間的距離的平方,這只是兩個多項式函數之間距離的平方,本身就是另一個多項式函數!請注意,我說的是距離的平方,而不是平方根。
本質上,對於立方體線段上的任何點,可以計算從該點到該線的距離的平方。這將是一個6階多項式。我們可以最小化距離的平方嗎?是。最小值必須出現在多項式的導數爲零的位置。所以區分,得到一個五階多項式。使用您最喜愛的根查找工具,可以根據數字生成所有根。詹金斯&特勞布,不管。從該組根中選擇正確的解決方案,排除任何複雜的解決方案,並且只在位於所述立方片段內的情況下選擇解決方案。確保排除與距離的局部最大值相對應的點。
所有這些都可以有效地完成,除了多項式根找到器以外不需要使用迭代優化器,因此不需要使用需要起始值的優化工具,只需找到接近該起始值的解決方案。
例如,在三維圖中,我顯示了一組由三維點組成的曲線(用紅色表示),然後我拿了另外一組位於外部圓的點,我計算了最接近指向每條曲線的內部曲線,繪製一條直線到該曲線。這些最小距離點由上述方案產生。
「不需要使用需要起始值的優化工具」......但是在一般情況下,根搜索算法還需要初始值或範圍! –
另外,在確定了與圓上每個離散點對應的三次曲線上的最近點之後,OP將必須找到這些點對中的哪一個給出了最小距離 - 換句話說,是優化,並且是一個相當天真的那個!我的意思是,你確實以統一的步長對你的圈子進行了抽樣,這是非常低效的,並且會給出不精確的結果。一個適當的優化算法可以更有效和精確地將局部最小值歸零。 –
否。像Jenkins和Traub這樣的多項式查找工具不需要用戶提供的起始值。或者,可以將多項式根問題轉換爲特徵值問題,然後使用特徵值求解器來計算根。 – 2011-12-13 09:38:22
在貝塞爾曲線的情況下和一個線
有三個候選人的最近點到行:
- 對貝塞爾曲線段中的位置即與該線平行(如果存在這樣的地方),
- 曲線段的一端,
- 曲線段的另一端。
測試所有三個;最短距離獲勝。
二貝塞爾曲線
的情況下,如果你想確切的分析結果,或者優化的數值結果是足夠好賴。
分析結果
給定兩個貝塞爾曲線一個(噸)和乙(小號),你可以得到方程的局部定向A'(t)和B'(s)。點對爲其甲 '(噸)= 乙'(小號)是候選,即(噸,小號)該曲線是局部平行。我沒有檢查,但我假定甲 '(噸) - 乙'(小號)= 0可以解析地求解。如果您的曲線與您在示例中顯示的曲線相似,則該方程式應該只有一個解或者沒有解,但可能有兩個(或者在曲線相同但翻譯的情況下無限多) - 在這種情況下你可以忽略它,因爲贏家將始終是曲線段端點之一)。
在類似於上述曲線輪廓大綱的方法中,測試每個點對,再加上曲線段端點。最短距離獲勝。
數值結果
假設在兩個Bézier曲線的點被定義爲甲(噸)和乙(小號)。您想最小化距離d(t,s)= | 甲(噸) - 乙(小號)|。這是一個簡單的雙參數的優化問題:找到小號和噸,最大限度地減少d(噸,小號)與約束0≤噸≤1和0≤小號≤1 。
由於d = SQRT((XA - 的xB)2 +(YA - YB)²),也可以只是最小化函數˚F(噸,小號)= [d(t,s)]²保存平方根計算。
對於這樣的優化問題有numerous ready-made methods。挑選。
注意,在上述兩種情況下,任何高階比二次貝塞爾曲線可以送禮者你比一個極小,所以這是值得提防。從你給的例子看,你的曲線看起來沒有拐點,所以這個問題可能不適用於你的情況。
- 1. 兩條曲線之間的最近點
- 2. 貝塞爾曲線和法國曲線
- 3. 如何計算多條曲線的OBB?
- 4. 曲線上的點掉出曲線
- 5. 擬合曲線,另一條曲線
- 6. 如何計算曲線上的點?
- 7. OpenCV識別線條和曲線
- 8. 兩條貝塞爾曲線(或兩條曲線和一條直線)的交點:代碼?
- 9. 情節線和曲線交點?
- 10. 不可靠的UIBezierPath曲線機制,controlPoint和曲線點
- 11. 如何繪製數組和曲線列表的曲線?
- 12. 貝塞爾曲線計算
- 13. 計算平均曲線
- 14. Java遊戲,計算曲線
- 15. 如何計算Javascript中線性浮點數的曲線?
- 16. 曲線
- 17. 彎曲曲線內的折線圖
- 18. 曲線樣條(python)
- 19. 統計曲線ios
- 20. 如何將二次曲線轉換爲線性曲線?
- 21. 二次Bézier曲線:計算點
- 22. 曲線擬合普朗克曲線
- 23. 正弦曲線沿着正弦曲線
- 24. 橢圓曲線點
- 25. 計算樣條曲線的最佳數量從集合點
- 26. 在SAS如何計算曲線
- 27. 爲什麼兩條曲線而不是一條曲線?
- 28. Scipy樣條曲線的峯值曲率
- 29. 刪除扭曲和平滑曲線
- 30. 如何ROC曲線
你的一些繪畫不包括一行,但你提到你的問題中的一個對象是一個。他們都是比較曲線嗎? – vlsd