看的第二篇论文matlab程序实现

阅读: 评论:0

看的第二篇论文matlab程序实现

看的第二篇论文matlab程序实现

一、直纹面边界为二次Bezier曲线设计成可展曲面

有关第二篇论文博客的超链接
论文二次部分的理论:

二、相应的matlab程序:

% date : 2020.10.14
% 第三篇论文的编程实现
% Developable Bezier patches: properties and design
% 双二次的可展曲面设计
% author : mw_1422102031
clear;
clc;% 直纹面编程示例:
% 直纹面方程:p(u,v) = (1-u)*a(v) + u*b(v) ; 
% 其中a(v),b(v)程序中分别取了两个bezier曲线clear;
clc;%A曲线的控制顶点
A0 = [0,0,1];  A1 = [1,2,3];  A2 = [2,1,0]; 
ax = [A0(1),A1(1),A2(1)];
ay = [A0(2),A1(2),A2(2)];
az = [A0(3),A1(3),A2(3)];                                  
[U,V] = meshgrid(0:0.02:1,0:0.02:1);
%给定c0,c2的方向向量
c0 = 0.01*[0,0,2]; 
c2 = 0.01*[0,3,-1];   
%另外一组方向向量
% c0 = 0.01*[0,0,1]; 
% c2 = 0.01*[1,3,-1];   
% 给定参数f的值
f = 125;
%由控制顶点计算a1,a2
a1 = [];
a2 = [];
a1(1) = ax(2) - ax(1);  a1(2) = ay(2) - ay(1);  a1(3) = az(2) - az(1);
a2(1) = ax(3) - ax(2);  a2(2) = ay(3) - ay(2);  a2(3) = az(3) - az(2);
%求c1的具体数值;   cross():叉乘命令
N1 = cross(a1,c0) ;  
N2 = cross(a2,c2) ;
c1 = cross(N1,N2) ;
%求参数s的值,需要计算两个行列式
p1 = det([a1;c2;c1]);
q1 = 1/(det([a2;c0;c2]));
s = f*p1*q1;
%求参数t的值
p2 = det([a2;c1;c0]);
q2 = 1/(det([a1;c0;c2]));
t = f*p2*q2;
%计算B曲线的的控制顶点
B0 = A0 + f*s*c0;  B1 = A1 + f*c1;  B2 = A2 + f*t*c2;
bx = [B0(1),B1(1),B2(1)];
by = [B0(2),B1(2),B2(2)];
bz = [B0(3),B1(3),B2(3)];
%A_bezier曲线
x = V;
n=length(ax)-1;
Ax = 0;
Ay = 0;
Az = 0;
for i = 1:n+1Ax = Ax + ax(i)*B(x,n,i-1) ;       %将控制顶点与Bernstein基函数相乘得到bezier曲线Ay = Ay + ay(i)*B(x,n,i-1) ;Az = Az + az(i)*B(x,n,i-1) ;
end
figure(1)
plot3(ax,ay,az,'k',ax,ay,az,'m*')  
hold on
plot3(Ax,Ay,Az,'r')                             %bezier曲线a(v)%B_bezier曲线
x = V;
n=length(bx)-1;
Bx = 0;  By = 0;  Bz = 0;
for i = 1:n+1Bx = Bx + bx(i)*B(x,n,i-1) ;       %将控制顶点与Bernstein基函数相乘得到bezier曲线By = By + by(i)*B(x,n,i-1) ;Bz = Bz + bz(i)*B(x,n,i-1) ;
end
figure(2)
plot3(bx,by,bz,'k',bx,by,bz,'m*')  
hold on
plot3(Bx,By,Bz,'r')   %将两条边界bezier曲线带入直纹面方程
X = (1-U).*Ax + U.*Bx ;
Y = (1-U).*Ay + U.*By ;
Z = (1-U).*Az + U.*Bz ;
%两种方式画图
figure(3)
mesh(X,Y,Z)

需要用到的函数(之前文章中都给过,之后可能就不详细列出来了):

%  第i个bernstein基函数
function y = B(x,n,i)
y = N(n,i).*(x.^i).*((1-x).^(n-i));
end
% 组合数  Number of combinations
function y = N(n,i)
y1 = factorial(n);            %n的阶乘
y2 = factorial(i)*factorial(n-i);
y = y1/y2;
end

有关第二篇论文博客的超链接

本文发布于:2024-02-04 12:28:06,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170707235955567.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:第二篇   程序   论文   matlab
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23