這里有這樣一個問題,比如我們有一條曲線,要求出曲線的左右一定范圍的邊界。
方法是:
1. 取曲線前后幀局部點對,計算點對得到的直線方程L1。
2. 點法式計算垂直於L1的直線L2。
3. 根據拓展半徑d以點對中后一個點畫圓,計算圓和L2的交點。
4. 連接所有交點得到曲線的邊界。
matlab代碼如下:
clear all; close all; clc; d=10; t = 1:0.1:20; x = 80*t - 5*t.*sin(t) ; y = t.^2 + cos(t); plot(x,y) hold on; line1=[]; line2=[]; for i=2:length(t) k = (y(i)-y(i-1))/(x(i)-x(i-1)); k1 = -1/k; b1 = y(i)-k1*x(i); tmp = sqrt(-b1^2 + d^2 + d^2*k1^2 - 2*b1*k1*x(i) - k1^2*x(i)^2 + 2*b1*y(i) + 2*k1*x(i)*y(i) - y(i)^2); x1 = (-b1*k1 + x(i) + k1*y(i) - tmp)/(1 + k1^2); y1 = b1 - (b1*k1^2)/(1 + k1^2) + (k1*x(i))/(1 + k1^2) + (k1^2*y(i))/(1 + k1^2) - (k1*tmp)/(1 + k1^2); x2 = (-b1*k1 + x(i) + k1*y(i) + tmp)/(1 + k1^2); y2 = b1 - (b1*k1^2)/(1 + k1^2) + (k1*x(i))/(1 + k1^2) + (k1^2*y(i))/(1 + k1^2) + (k1*tmp)/(1 + k1^2); line1=[line1;x1 y1]; line2=[line2;x2 y2]; end plot(line1(:,1),line1(:,2),'r'); plot(line2(:,1),line2(:,2),'r'); axis equal
結果如下:
半徑10米的結果:
半徑50米的結果:
可以看出半徑大的時候在曲線曲率大的地方會形成毛刺,要解決毛刺問題其實可以先求得中心曲線的方程,再用上述方法得到邊界離散點,最后用最小二乘以曲線的模型對離散點進行擬合。
應該就可以解決毛刺了,我這里就不實驗了,應該是可以的。