matlab用曲率将sin(x)分割成30分并且得到分割图像

用曲率将sin(x)分成三十分
x = 0:0.01:2*pi;
y = sin(x);
j = abs(sin(x)) ./ ((1+cos(x).^2).^(3/2));
x1 = diff(x);    
x2 = diff(x1);    
y1 = diff(y);
y2 = diff(y1);
x2(length(x1)) = x2(end);
y2(length(y1)) = y2(end);
k = abs(x1.*y2-x2.*y1) ./ (x1.^2+y1.^2).^(3/2);
k(length(x)) = k(end);
N = 30;
deltaS = k / (N+1);
posX = zeros(N + 2, 1);
posY = zeros(N + 2, 1);
posX(1) = x(1);
posY(1) = y(1);
currentArc = 0;
lastArc = 0;
l = 2; 
for i = 2:length(x)
    dx = x(i) - x(i-1);
    dy = y(i) - y(i-1);
    d = sqrt(dx^2 + dy^2);
    currentArc = currentArc + d;
    while currentArc - lastArc >= deltaS
        frac = (currentArc - lastArc - deltaS) / d;
        posX(l) = (1-frac)*x(i-1) + frac*x(i);
        posY(l) = (1-frac)*y(i-1) + frac*y(i);
        l = l + 1;
        lastArc = lastArc + deltaS;
    end
end
posX(end) = x(end);
posY(end) = y(end);
figure;
plot(x, y, '-');
hold on;
plot(posX, posY, 'r.', 'MarkerSize', 10);
axis equal;
xlabel('x');
ylabel('y');

它显示无法执行赋值,因为左侧和右侧的元素数目不同。

matlab2018b

######能够均分成30分并且生成分割图像

x = 0:0.01:2*pi;
y = sin(x);
j = abs(sin(x))./((1+cos(x).^2).^(3/2));
x1 = diff(x);
x2 = diff(x1);
y1 = diff(y);
y2 = diff(y1);
x2(length(x1)) = x2(end);
y2(length(y1)) = y2(end);
k = abs(x1.*y2 - x2.*y1)./(x1.^2 + y1.^2).^(3/2);
k(length(x)) = k(end);
N = 30;
deltaS = k/(N+1);
posX = zeros(N+2, 1);
posY = zeros(N+2, 1);
posX(1) = x(1);
posY(1) = y(1);

for i = 2:N+2
    deltaT = deltaS(i-1)/sqrt(1 + j(i-1)^2);
    posX(i) = posX(i-1) + deltaT*cos(atan(j(i-1)));
    posY(i) = posY(i-1) + deltaT*sin(atan(j(i-1)));
end

subplot(2,2,3);
plot(posX, posY);
title('分割后的曲线图');
xlabel('X');
ylabel('Y');

subplot(2,2,1);
plot(x, y);
title('sin(x)原图');
xlabel('X');
ylabel('Y');

希望这个代码对你有帮助!

具体错误截图发一下