Mathematica或MATLAB怎样将空间三维点拟合成一个圆形,并将该圆形划出!!!!

Matlabcurvefittingtool怎样拟合空间圆形,点分布已经有了!!!!... Matlab curve fitting tool怎样拟合空间圆形,点分布已经有了!!!! 展开
 我来答
兔子和小强
2014-11-25 · TA获得超过6941个赞
知道大有可为答主
回答量:3332
采纳率:74%
帮助的人:1329万
展开全部


至于画圆:只要从A开始,每次沿着切线方向旋转一个小角度即可。代码如下:

%%
A = rand(3, 1);
B = rand(3, 1);
C = rand(3, 1);

figure, hold on;
plot3(A(1), A(2), A(3), 'or');
plot3(B(1), B(2), B(3), 'or');
plot3(C(1), C(2), C(3), 'or');

%%
W = ([A-B A-C]'*[A-B A-C])\[(A-B)'*(B-A); (A-C)'*(C-A)]/2;
O = [A-B A-C]*W+A;
R = pdist([O'; A']);

plot3(O(1), O(2), O(3), '*');
F = cross(O-A, O-B);
P = A;
n = 100;
for t = 0:n
    l = cross(O-P, F);
    l = l/norm(l);
    P = P + tan(2*pi/n)*R*l;
    P = O + (P-O)*cos(2*pi/n);
    plot3(P(1), P(2), P(3), '.');
end

结果:

追问
谢谢您的回答,不过我所测点。并非一个标准圆。是想通过类似最小二乘法之类的算法。求出这些离散点的回归方程
追答


程序如下:

function [O, R, F] = ff(X)
n = size(X, 2);
function L = L(t)
    O = t(1:3); R = t(4);
    P = repmat(O, 1, n)-X;
    L = sum(abs(sqrt(sum(P.*P, 1))-R));
end

O0 = mean(X, 2);
R0 = norm(O0-X(:,1));
OR = fminsearch(@L, [O0; R0], optimset('MaxFunEvals', 100000));
O = OR(1:3);
R = OR(4);

P = repmat(O, 1, n)-X;
[v, d] = eig(P*P');
[t, i] = min(max(d));
F = v(:,i);
end

调用这函数的方式是:

figure; hold on;
zlim([-1 2])

%% 数据准备,这里只是随便产生几个数据,请改成自己的实验数据。
t = (0:.1:2*pi);
n = numel(t);
X = rand(3, n) + 5*[cos(t); sin(t); zeros(1,n)];
plot3(X(1,:), X(2,:), X(3,:), 'o');

%% 计算圆心、半径和平面法向量
[O, R, F] = ff(X);
plot3(O(1), O(2), O(3), '*');

%% 画圆
P = cross(F, F+[0; 0; norm(F)]);
P = O + P*R/norm(P);
n = 100;
for t = 0:n
    l = cross(O-P, F);
    l = l/norm(l);
    P = P + tan(2*pi/n)*R*l;
    P = O + (P-O)*cos(2*pi/n);
    plot3(P(1), P(2), P(3), '.');
end

PS:如果你知道你的数据点是均匀分布在圆上的话,直接取平均就可以求出圆心和半径!!

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式