给出三角形的三个顶点的坐标,用差分方程求其重心的坐标。具体题目描述如下图所示。
为了求三角形的重心,我们知道,三角形的重心坐标在中线交点,也就是中线的
1
3
\frac{1}{3}
31位置处,不妨设三角形的三个坐标分别为
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1),
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2),
(
x
3
,
y
3
)
(x_3,y_3)
(x3,y3),则重心的横坐标可以表示为
x
c
=
x
1
+
x
2
2
+
1
3
×
(
x
3
−
x
1
+
x
2
2
)
=
1
3
(
x
1
+
x
2
+
x
3
)
,
x_c=\frac{x_1+x_2}{2}+\frac{1}{3} \times (x_3-\frac{x_1+x_2}{2})=\frac{1}{3}(x_1+x_2+x_3),
xc=2x1+x2+31×(x3−2x1+x2)=31(x1+x2+x3),
同理,重心的纵坐标为
y
c
=
1
3
(
y
1
+
y
2
+
y
3
)
y_c=\frac{1}{3}(y_1+y_2+y_3)
yc=31(y1+y2+y3)。考虑到重心与前序三角形顶点构成的序列关系,可以推出重心迭代的差分方程为
x
n
+
3
=
1
3
(
x
n
+
x
n
+
1
+
x
n
+
2
)
,
x_{n+3}=\frac{1}{3}(x_{n}+x_{n+1}+x_{n+2}),
xn+3=31(xn+xn+1+xn+2),
y
n
+
3
=
1
3
(
y
n
+
y
n
+
1
+
y
n
+
2
)
.
y_{n+3}=\frac{1}{3}(y_{n}+y_{n+1}+y_{n+2}).
yn+3=31(yn+yn+1+yn+2).
于是,将迭代的代码表示如下,并显示画图的结果。
X、Y是初始坐标,n是迭代次数,直接在代码块里面修改就可以了,点击运行直接出结果。
% 重心坐标的原理,设已知三点的坐标分别为(x1,y1),(x2,y2),(x3,y3),那么重心坐标为
% x=(x1+x2+x3)/3, y=(y1+y2+y3)/3,由此可以推断出重心坐标的差分公式为
% x(n+3)=(x(n)+x(n+1)+x(n+2))/3;
% y(n+3)=(y(n)+y(n+1)+y(n+2))/3;
X= [1 2 3];
Y= [4 7 6];
plot([X X(1)],[Y Y(1)]), hold on
S = Centre(X, Y, 8)
%% 主程序如下
function S = Centre(X, Y, n)
% X, Y为初始三个点的横纵坐标,n为需要求解的迭代次数,S保存所有重心坐标
x(1:3)=X;
y(1:3)=Y;
S=[];
for i=1:n
x(i+3)=(x(i+2)+x(i+1)+x(i))/3;
y(i+3)=(y(i+2)+y(i+1)+y(i))/3;
S=[S;[x(i+3) y(i+3)]];
line([x(i+3) x(i+2)],[y(i+3) y(i+2)]); hold on
line([x(i+3) x(i+1)],[y(i+3) y(i+1)]); hold on
end
end
当迭代8次时,输出的结果如下图。
不同坐标分布的规律探寻:
close all
clear all
clc
% 重心坐标的原理,设已知三点的坐标分别为(x1,y1),(x2,y2),(x3,y3),那么重心坐标为
% x=(x1+x2+x3)/3, y=(y1+y2+y3)/3,由此可以推断出重心坐标的差分公式为
% x(n+3)=(x(n)+x(n+1)+x(n+2))/3;
% y(n+3)=(y(n)+y(n+1)+y(n+2))/3;
tic
a= [4 0 5];
b= [3 0 0];
for i=1:3
for j=1:2
X(1)=a(i); Y(1)=b(i);
k = i+j-3*(i+j>3);
X(2)=a(k); Y(2)=b(k);
k = k+j-3*(k+j>3);
X(3)=a(k); Y(3)=b(k);
subplot(2,3,i+(j-1)*3)
plot([X X(1)],[Y Y(1)]), hold on
S = Centre(X, Y, 8);
end
end
toc
%% 主程序如下
function S = Centre(X, Y, n)
% X, Y为初始三个点的横纵坐标,n为需要求解的迭代次数,S保存所有重心坐标
x(1:3)=X;
y(1:3)=Y;
S=[];
for i=1:n
x(i+3)=(x(i+2)+x(i+1)+x(i))/3;
y(i+3)=(y(i+2)+y(i+1)+y(i))/3;
S=[S;[x(i+3) y(i+3)]];
line([x(i+3) x(i+2)],[y(i+3) y(i+2)]); hold on
line([x(i+3) x(i+1)],[y(i+3) y(i+1)]); hold on
end
end