线性插值函数的基函数构造
这里介绍的基函数为线性插值对应的基函数,也就是通过不在同一直线上的三个点构造的平面。这里我们直接通过三个点构造一个平面,再将其写法简单的变形就可以找到对应的基函数。
设 A : ( x 1 , y 1 , z 1 ) , B : ( x 2 , y 2 , z 2 ) , C : ( x 3 , y 3 , z 2 ) A:(x_1,y_1,z_1),B:(x_2,y_2,z_2),C:(x_3,y_3,z_2) A:(x1,y1,z1),B:(x2,y2,z2),C:(x3,y3,z2)是空间中不在同一直线上的三个点,且 A , B , C A,B,C A,B,C三点在平面 π : a x + b y + c z + d = 0 \pi:ax+by+cz+d=0 π:ax+by+cz+d=0上。
这里,利用点法式确定平面 π \pi π。首先,根据向量 A B ⃗ = [ x 2 − x 1 , y 2 − y 1 , z 2 − z 1 ] \vec{AB}=[x_2-x_1,y_2-y_1,z_2-z_1] AB=[x2−x1,y2−y1,z2−z1], A C ⃗ = [ x 3 − x 1 , y 3 − y 1 , z 3 − z 1 ] \vec{AC}=[x_3-x_1,y_3-y_1,z_3-z_1] AC=[x3−x1,y3−y1,z3−z1]构造垂直于 A B ⃗ , A C ⃗ \vec{AB},\vec{AC} AB,AC的向量 n ⃗ \vec{n} n, n ⃗ \vec{n} n即为所求平面的法向量,
n ⃗ = A B ⃗ × A C ⃗ = [ ( y 2 − y 1 ) ( z 3 − z 1 ) − ( y 3 − y 1 ) ( z 2 − z 1 ) , ( z 2 − z 1 ) ( x 3 − x 1 ) − ( z 3 − z 1 ) ( x 2 − x 1 ) , ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) ] \vec{n} = \vec{AB}\times\vec{AC}\\\ \ \ = [(y_2-y_1)(z_3-z_1)-(y_3-y_1)(z_2-z_1), \\\ \ \ \ \ \ \ \ \ (z_2-z_1)(x_3-x_1)-(z_3-z_1)(x_2-x_1), \\\ \ \ \ \ \ \ \ \ (x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1)] n=AB×AC =[(y2−y1)(z3−z1)−(y3−y1)(z2−z1), (z2−z1)(x3−x1)−(z3−z1)(x2−x1), (x2−x1)(y3−y1)−(x3−x1)(y2−y1)]
进而,设点
P
(
x
,
y
,
z
)
P(x,y,z)
P(x,y,z)在平面
π
\pi
π上,则有
P
A
⃗
⊥
n
⃗
\vec{PA}\perp\vec{n}
PA⊥n,即
0
=
(
x
−
x
1
)
(
(
y
2
−
y
1
)
(
z
3
−
z
1
)
−
(
y
3
−
y
1
)
(
z
2
−
z
1
)
)
+
(
y
−
y
1
)
(
(
z
2
−
z
1
)
(
x
3
−
x
1
)
−
(
z
3
−
z
1
)
(
x
2
−
x
1
)
)
+
(
z
−
z
1
)
(
(
x
2
−
x
1
)
(
y
3
−
y
1
)
−
(
x
3
−
x
1
)
(
y
2
−
y
1
)
)
0 = (x-x_1)((y_2-y_1)(z_3-z_1)-(y_3-y_1)(z_2-z_1))\\\ \ \ +(y-y_1)((z_2-z_1)(x_3-x_1)-(z_3-z_1)(x_2-x_1))\\\ \ \ +(z-z_1)((x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1))
0=(x−x1)((y2−y1)(z3−z1)−(y3−y1)(z2−z1)) +(y−y1)((z2−z1)(x3−x1)−(z3−z1)(x2−x1)) +(z−z1)((x2−x1)(y3−y1)−(x3−x1)(y2−y1))
整理可得:
( ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) ) z = − ( z 1 ( ( x − x 1 ) ( y 3 − y 1 − ( y 2 − y 1 ) ) + z 2 ( ( y − y 1 ) ( x 3 − x 1 ) − ( x − x 1 ) ( y 3 − y 1 ) ) + z 3 ( ( x − x 1 ) ( y 2 − y 1 ) − ( y − y 1 ) ( x 1 − x 1 ) ) + z 1 ( y − y 1 ) ( x 2 − x 1 − ( x 3 − x 1 ) ) ) + z 1 ( ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) ) = z 1 ( ( x − x 2 ) ( y 2 − y 3 ) + ( y − y 2 ) ( x 3 − x 2 ) ) + z 2 ( ( x − x 3 ) ( y 3 − y 1 ) + ( y − y 3 ) ( x 1 − x 3 ) ) + z 3 ( ( x − x 1 ) ( y 1 − y 2 ) + ( y − y 1 ) ( x 2 − x 1 ) ) ((x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1))z \\= -(z_1((x-x_1)(y_3-y_1-(y_2-y_1))\\\ \ \ +z_2((y-y_1)(x_3-x_1)-(x-x_1)(y_3-y_1))\\\ \ \ +z_3((x-x_1)(y_2-y_1)-(y-y_1)(x_1-x_1))\\\ \ \ +z_1(y-y_1)(x_2-x_1-(x_3-x_1)))\\\ \ \ +z_1((x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1)) \\=z_1((x-x_2)(y_2-y_3)+(y-y_2)(x_3-x_2))\\+z_2((x-x_3)(y_3-y_1)+(y-y_3)(x_1-x_3))\\+z_3((x-x_1)(y_1-y_2)+(y-y_1)(x_2-x_1)) ((x2−x1)(y3−y1)−(x3−x1)(y2−y1))z=−(z1((x−x1)(y3−y1−(y2−y1)) +z2((y−y1)(x3−x1)−(x−x1)(y3−y1)) +z3((x−x1)(y2−y1)−(y−y1)(x1−x1)) +z1(y−y1)(x2−x1−(x3−x1))) +z1((x2−x1)(y3−y1)−(x3−x1)(y2−y1))=z1((x−x2)(y2−y3)+(y−y2)(x3−x2))+z2((x−x3)(y3−y1)+(y−y3)(x1−x3))+z3((x−x1)(y1−y2)+(y−y1)(x2−x1))
由三角形面积 S △ A B C = 1 / 2 ( ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) ) S_{\triangle ABC}=1/2((x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1)) S△ABC=1/2((x2−x1)(y3−y1)−(x3−x1)(y2−y1))因此有
z = [ z 1 ( ( x − x 2 ) ( y 2 − y 3 ) + ( y − y 2 ) ( x 3 − x 2 ) ) + z 2 ( ( x − x 3 ) ( y 3 − y 1 ) + ( y − y 3 ) ( x 1 − x 3 ) ) + z 3 ( ( x − x 1 ) ( y 1 − y 2 ) + ( y − y 1 ) ( x 2 − x 1 ) ) ] / ( 2 ∗ S △ A B C ) z = [z_1((x-x_2)(y_2-y_3)+(y-y_2)(x_3-x_2))\\\ \ +z_2((x-x_3)(y_3-y_1)+(y-y_3)(x_1-x_3))\\\ \ +z_3((x-x_1)(y_1-y_2)+(y-y_1)(x_2-x_1))]/(2*S_{\triangle ABC}) z=[z1((x−x2)(y2−y3)+(y−y2)(x3−x2)) +z2((x−x3)(y3−y1)+(y−y3)(x1−x3)) +z3((x−x1)(y1−y2)+(y−y1)(x2−x1))]/(2∗S△ABC)
因此线性插值基函数可以写为
N A = ( ( x − x 2 ) ( y 2 − y 3 ) + ( y − y 2 ) ( x 3 − x 2 ) ) / ( 2 ∗ S △ A B C ) N_A = ((x-x_2)(y_2-y_3)+(y-y_2)(x_3-x_2))/(2*S_{\triangle ABC}) NA=((x−x2)(y2−y3)+(y−y2)(x3−x2))/(2∗S△ABC)
N B = ( ( x − x 3 ) ( y 3 − y 1 ) + ( y − y 3 ) ( x 1 − x 3 ) ) / ( 2 ∗ S △ A B C ) N_B=((x-x_3)(y_3-y_1)+(y-y_3)(x_1-x_3))/(2*S_{\triangle ABC}) NB=((x−x3)(y3−y1)+(y−y3)(x1−x3))/(2∗S△ABC)
N C = ( ( x − x 1 ) ( y 1 − y 2 ) + ( y − y 1 ) ( x 2 − x 1 ) ) / ( 2 ∗ S △ A B C ) N_C=((x-x_1)(y_1-y_2)+(y-y_1)(x_2-x_1))/(2*S_{\triangle ABC}) NC=((x−x1)(y1−y2)+(y−y1)(x2−x1))/(2∗S△ABC)
上述基函数也可以写为
N A = ( x ( y 2 − y 3 ) + y ( x 3 − x 2 ) + x 2 y 3 − y 2 x 3 ) / ( 2 ∗ S △ A B C ) N_A = (x(y_2-y_3)+y(x_3-x_2)+x_2y_3-y_2x_3)/(2*S_{\triangle ABC}) NA=(x(y2−y3)+y(x3−x2)+x2y3−y2x3)/(2∗S△ABC)
N B = ( x ( y 3 − y 1 ) + y ( x 1 − x 3 ) + x 3 y 1 − y 3 x 1 ) / ( 2 ∗ S △ A B C ) N_B=(x(y_3-y_1)+y(x_1-x_3)+x_3y_1-y_3x_1)/(2*S_{\triangle ABC}) NB=(x(y3−y1)+y(x1−x3)+x3y1−y3x1)/(2∗S△ABC)
N C = ( x ( y 1 − y 2 ) + y ( x 2 − x 1 ) + x 1 y 2 − x 2 y 1 ) / ( 2 ∗ S △ A B C ) N_C=(x(y_1-y_2)+y(x_2-x_1)+x_1y_2-x_2y_1)/(2*S_{\triangle ABC}) NC=(x(y1−y2)+y(x2−x1)+x1y2−x2y1)/(2∗S△ABC)
注意:这里利用空间中不在同一条直线上的三个点确定唯一平面,通过这种方式构造平面方程,进一步改写方程样式,得到基函数。
实验结果
我们绘制过点
A
:
(
1
,
2
,
1
)
,
B
:
(
2
,
3
,
6
)
,
C
:
(
1
,
6
,
3
)
A:(1,2,1),B:(2,3,6),C:(1,6,3)
A:(1,2,1),B:(2,3,6),C:(1,6,3)的平面
π
\pi
π,结果如下
实例代码如下:
clc,clear
x = [1,2,4];
y = [2,3,1];
z = [1,6,3];
p = (x(1)-x(2))*(y(1)-y(3)) - (y(1)-y(2))*(x(1)-x(3));
% K1 = @(t,s)(s-y(2))*(x(3)-x(2)) - (t-x(2))*(y(3)-y(2));
% K2 = @(t,s)(s-y(3))*(x(1)-x(3)) - (t-x(3))*(y(1)-y(3));
% K3 = @(t,s)(s-y(1))*(x(2)-x(1)) - (t-x(1))*(y(2)-y(1));
K1 = @(t,s)((y(2)-y(3))*t - (x(2)-x(3))*s + x(2)*y(3)-x(3)*y(2));
K2 = @(t,s)((y(3)-y(1))*t - (x(3)-x(1))*s + x(3)*y(1)-x(1)*y(3));
K3 = @(t,s)((y(1)-y(2))*t - (x(1)-x(2))*s + x(1)*y(2)-x(2)*y(1));
disp('下面这个矩阵为基函数在对应点处的值,即克罗内克尔符号矩阵')
disp([K1(x(1),y(1)),K1(x(2),y(2)),K1(x(3),y(3))
K2(x(1),y(1)),K2(x(2),y(2)),K2(x(3),y(3))
K3(x(1),y(1)),K3(x(2),y(2)),K3(x(3),y(3))]/p)
F = @(t,s) (z(1) * K1(t,s) + z(2) * K2(t,s) + z(3) * K3(t,s))/p;
% F = triangle_2D(x,y,z);
xx = 0:0.1:5;
for i = 1:length(xx)
for j = 1:length(xx)
Z(j,i) = F(xx(i),xx(j));
end
end
% 注意到surf绘图中,Z的列数对应的是X,行数对应的是Y,在制作Z矩阵时,应该注意这一点。
[X,Y] = meshgrid(xx);
surf(X,Y,Z)
hold on
plot3(x,y,z,'r*')