直紋面是一類特殊的曲面,它可以由一族直線「織成」,即過曲線上每一點都存在過該點的直線落在該曲面上。
直紋面在幾何造型中的應用非常廣泛。直紋面是直線段在空間中沿某一定曲線運動所形成的軌跡. 定曲線稱為準線,直線段稱為母線。如下圖:
設準線為
h
(
u
)
h(u)
h(u), 母線的方向向量為
l
(
u
)
l(u)
l(u), 則直紋面的方程為:
P
(
u
,
v
)
=
h
(
u
)
+
v
h
(
u
)
,
P(u,v) = h(u) + vh(u),
P(u,v)=h(u)+vh(u),
其中,
u
∈
[
u
0
,
u
1
]
,
v
∈
[
v
0
,
v
1
]
.
u\in[u_0,u_1],v\in[v_0,v_1].
u∈[u0,u1],v∈[v0,v1].
在實際應用中,直紋面還可以表示為
P
(
u
,
v
)
=
(
1
−
v
)
a
(
u
)
+
v
b
(
u
)
,
P(u,v) = (1-v)a(u) + vb(u),
P(u,v)=(1−v)a(u)+vb(u),
其中,
u
∈
[
u
0
,
u
1
]
,
v
∈
[
0
,
1
]
.
u\in[u_0,u_1],v\in[0,1].
u∈[u0,u1],v∈[0,1]. 顯然曲線
a
(
u
)
,
b
(
u
)
a(u),b(u)
a(u),b(u)為直紋面在
v
=
0
,
1
v = 0,1
v=0,1時的兩條邊界曲線
function Ruled_surface
% 直紋面程式設計範例:
% 直紋面方程:p(u,v) = (1-u)*a(v) + u*b(v) ;
% 其中a(v),b(v)程式中分別取了兩個bezier曲線
clear;
clc;
[U,V] = meshgrid(0:0.02:1,0:0.02:1);
%第一條bezier曲線 a(v)
rx=[0,1,2,3,4,7];
ry=[0,0,-3,5,6,6]; %控制頂點(0,0),(1,0),(2,-3),...
M = 40;
hx = 1/M; %將[0,1]區間M等分
x = V;
n=length(rx)-1;
Rx = 0;
Ry = 0;
for i = 1:n+1
Rx = Rx + rx(i)*B(x,n,i-1) ; %將控制頂點與Bernstein基函數相乘得到bezier曲線
Ry = Ry + ry(i)*B(x,n,i-1) ;
end
figure(1)
plot(Rx,Ry,'r') %bezier曲線a(v)
%第二條bezier曲線 b(v)
px=[0,1,2,3,4,6];
py=[0,2,15,5,6,6]; %控制頂點(0,0),(1,2),....
M = 40;
hx = 1/M; %將[0,1]區間M等分
x = V;
n=length(px)-1;
PX = 0;
PY = 0;
for i = 1:n+1
PX = PX + px(i)*B(x,n,i-1) ; %將控制頂點與Bernstein基函數相乘得到bezier曲線
PY = PY + py(i)*B(x,n,i-1) ;
end
figure(2)
plot(PX,PY,'b') %bezier曲線b(v)
%將兩條邊界bezier曲線帶入直紋面方程
X = (1-U).*Rx + U.*PX;
Y = (1-U).*Ry + U.*PY ;
Z = (1-U).*2 + U.*(33) ;
%兩種方式畫圖
figure(3)
surf(U,V,Y)
figure(5)
surf(X,Y,Z)
figure(4)
mesh(X,Y,Z)
end
% 第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
可以直接在matlab上執行的。
1.第一條邊界bezier曲線:
2. 第二條邊界bezier曲線:
3. 最終生成的直紋面