курсачи / Matlab_kod_dlya_testirovania
.rtfclc;
clear all;
disp('Введите координаты точек начала (X1,Y1) и конца (X2,Y2) прямой')
X1=input('X1= ');
Y1=input('Y1= ');
Z1=input('Z1= ');
X2=input('X2= ');
Y2=input('Y2= ');
Z2=input('Z2= ');
plot3([X1 X2], [Y1 Y2], [Z1 Z2])
hold on
grid on
xlabel('x')
ylabel('y')
zlabel('z')
% xlim([-3 10])
% ylim([-5 10])
% zlim([-3 3])
%Есть плоскоть заданная тремя точками, т.е. треугольник
A = [1,1,0];
B = [5,3,0];
C = [3,4,1];
%График треугольника и прямой
Xtri = [1,5,3,1]; %Вектора координат треугольника для команды plot3
Ytri = [1,3,4,1];
Ztri = [0,0,1,0];
plot3(Xtri,Ytri,Ztri)
hold on
grid on %Рисует синим треугольник
% Формируем вектор (прямая) из двух координат точек
Pramaya = [X1,Y1,Z1; X2,Y2,Z2];
PramayaRaz = [X2-X1,Y2-Y1,Z2-Z1]; %Приведение вектора-прямой к декартовой системе координат
%Наждение вектора нормальли к плоскости. Для этого возьмем коэфициенты из
%уравнения плоскости aх+bу+cz+d=0
a=2;
b=-4;
c=8;
d=2;
n=[2,-4,8]; %нормаль плоскости треугольника
%Прямая пересекает плоскость тогда и только тогда, когда её направляющий вектор
%не ортогонален вектору нормали плоскости.
if dot(PramayaRaz,n)==0
disp('непересекает, так как векторы ортогональны')
else
disp('Прямая пересекает плоскость теругольника')
t=((-a*X1-b*Y1-c*Z1-d)/(a*(X2-X1)+b*(Y2-Y1)+c*(Z2-Z1)));
x0=(X2-X1)*t+X1;
y0=(Y2-Y1)*t+Y1;
z0=(Z2-Z1)*t+Z1;
disp('Точка пересечения равна')
[x,y,z]=sphere(30);
surf(0.05*x+x0,0.05*y+y0,0.05*z+z0)
P=[x0,y0,z0];
disp(P);
end
%Нужно определить прнадлежность точки к плоскости треугольника.
%Найдем длину сторон треугольника
AB=sqrt(20);%Длина стороны АВ
BC=sqrt(6);%Длина стороны ВС
CA=sqrt(14);%Длина стороны ВС
Pabc=(AB+BC+CA)/2;%Периметр треугольника АВС
AP=sqrt(((x0-1)^2)+((y0-1)^2)+((z0-0)^2));%Длина стороны АР
BP=sqrt(((x0-5)^2)+((y0-3)^2)+((z0-0)^2));%Длина стороны ВР
CP=sqrt(((x0-3)^2)+((y0-4)^2)+((z0-1)^2));%Длина стороны СР
Papb=(AP+BP+AB)/2;%Периметр треугольника АРВ
Papc=(AP+CP+CA)/2;%Периметр треугольника АРС
Pbpc=(BP+CP+BC)/2;%Периметр треугольника РВС
Sabc=sqrt(Pabc*(Pabc-AB)*(Pabc-BC)*(Pabc-CA));%Площадь треугольника АВС
% Sabc=round((Sabc*100+0.05)/100);
Sapb=sqrt(Papb*(Papb-AP)*(Papb-BP)*(Papb-AB));%Площадь треугольника АРС
Sapc=sqrt(Papc*(Papc-AP)*(Papc-CP)*(Papc-CA));%Площадь треугольника АРС
Sbpc=sqrt(Pbpc*(Pbpc-BP)*(Pbpc-CP)*(Pbpc-BC));%Площадь треугольника РВС
% S=round(((Sapb+Sapc+Sbpc)*100-0.5)/100);
if Sabc>=Sapb+Sapc+Sbpc
disp('Точка принадлежит плоскости треугольника')
else
disp('Точка не принадлежит плоскости треугольника')
end