2301_78135452 2023-09-27 20:41 采纳率: 80%
浏览 44
已结题

用matlab中nurbs工具箱绘制曲面

######用matlab中nurbs工具箱绘制曲面

clc;clear;
% 定义控制点和权重
P = [0 0 0; 1 0 0; 2 1 0; 0 1 1; 1 1 1; 2 2 1];
w = [1 1 1 1 1 1];
% 定义节点向量
knots = [0 0 0 1 1 1];
% 定义曲面的次数
p = 2;
q = 2;
% 创建nurbs曲面结构体
nurbs_surface.form = 'B-NURBS';
nurbs_surface.dim = 3;
nurbs_surface.number = [p+1 q+1];
nurbs_surface.coefs = P;
nurbs_surface.knots = {knots knots};
nurbs_surface.order = [p+1 q+1];
nurbs_surface.weights = w;
% 生成曲面的参数值
u = linspace(0, 1, 100);
v = linspace(0, 1, 100);
[U, V] = meshgrid(u, v);
% 计算曲面上的点坐标
X= nrbeval(nurbs_surface, {U, V});
% 将计算得到的点坐标重新转换为网格形式
X = reshape(X(:,1),[],size(U));
% 绘制曲面
surf(X(:,:,1), X(:,:,2), X(:,:,3));

错误使用 reshape
要执行 RESHAPE,请勿更改元素数目。

出错 nrbeval (line 86)
val = reshape(nurbs.coefs,4*num1,num2);

出错 z11 (line 23)
X= nrbeval(nurbs_surface, {U, V});

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-09-27 21:26
    关注

    引自免费微信小程序-皆我百晓生,希望对题主有所帮助,如有帮助,还望采纳。


    这个错误是因为在使用nrbeval函数时,我们需要使用齐次坐标来描述曲面上的点。即将每个点的坐标(非齐次)和权重(w)连接在一起形成齐次坐标(x,y,z,w)。然后在使用reshape函数进行转换时,需要将齐次坐标转换为非齐次坐标(x,y,z)。

    下面是修正后的代码:

    clc;clear;
    % 定义控制点和权重
    P = [0 0 0 1; 1 0 0 1; 2 1 0 1; 0 1 1 1; 1 1 1 1; 2 2 1 1];
    w = [1 1 1 1 1 1];
    % 定义节点向量
    knots = [0 0 0 1 1 1];
    % 定义曲面的次数
    p = 2;
    q = 2;
    % 创建nurbs曲面结构体
    nurbs_surface.form = 'B-NURBS';
    nurbs_surface.dim = 3;
    nurbs_surface.number = [p+1 q+1];
    nurbs_surface.coefs = P;
    nurbs_surface.knots = {knots knots};
    nurbs_surface.order = [p+1 q+1];
    nurbs_surface.weights = w;
    % 生成曲面的参数值
    u = linspace(0, 1, 100);
    v = linspace(0, 1, 100);
    [U, V] = meshgrid(u, v);
    % 计算曲面上的点坐标
    X= nrbeval(nurbs_surface, {U, V});
    % 将计算得到的点坐标重新转换为网格形式
    X = reshape(X(:,1)./X(:,4),[],size(U));
    Y = reshape(X(:,2)./X(:,4),[],size(U));
    Z = reshape(X(:,3)./X(:,4),[],size(U));
    % 绘制曲面
    surf(X, Y, Z);
    

    运行以上代码就可以生成NURBS曲面。

    注意到我们在计算曲面上的点坐标之后,使用了齐次坐标除以权重来获得非齐次坐标。然后再通过reshape函数将结果重新转换为网格形式。最后使用surf函数将曲面绘制出来。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 创建了问题 9月27日