matlab練習程序(擴展曲線邊界)


這里有這樣一個問題,比如我們有一條曲線,要求出曲線的左右一定范圍的邊界。

方法是:

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米的結果:

可以看出半徑大的時候在曲線曲率大的地方會形成毛刺,要解決毛刺問題其實可以先求得中心曲線的方程,再用上述方法得到邊界離散點,最后用最小二乘以曲線的模型對離散點進行擬合。

應該就可以解決毛刺了,我這里就不實驗了,應該是可以的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM