close all
A=[23, 10, -1.14]; % 点A的坐标
B=[27.36, 10, -1.14]; % 点B的坐标
C=[21, 5, 0.68]; % 点C的坐标
theta = 70/180*pi; % 平面夹角
% 平面ABC上的向量AB AC
AB=B-A;
AC=C-A;
% 平面ABC的法向量
n_ABC = -cross(AB,AC);
n_ABC_norm = n_ABC / norm(n_ABC);
% 激光平面与工件表面夹角 theta 的余弦值
cos_theta = cos(theta);
% 换元法使用 kb来代替系数进行推导
k = -AB(2)/AB(1);
b = -AB(3)/AB(1);
% 求解平面 ABD的法向量 V(i,j,1) 的j值
m = n_ABC_norm(1);
n = n_ABC_norm(2);
q = n_ABC_norm(3);
j2_A = cos_theta2*(k2+1) - (mk+n)^2;
j2_B = 2kbcos_theta^2 - 2(mk+n)(mb+q);
j2_C = cos_theta2*(b2+1) - (m*b+q)^2;
j1 = (-j2_B + sqrt(j2_B^2 - 4j2_Aj2_C))/2/j2_A;
j2 = (-j2_B - sqrt(j2_B^2 - 4j2_Aj2_C))/2/j2_A;
i1 = kj1 + b;
i2 = kj2 + b;
i = i1;
j = j1;
V = [i, j ,1];
t = -(iAC(1) + jAC(2) + AC(3)) / (i*j + j^2 + 1);
D = C + t*V;
theta_AB_AC = acos(dot(AB, AC) / (norm(AB) * norm(AC)));
fprintf('The Angle of AB&AC is:%f\n', theta_AB_AC*180/pi);
CD = D - C;
BD = D - B;
AD = D - A;
theta_AD_AB = acos(dot(AB, AD) / (norm(AB) * norm(AD)));
fprintf('The Angle of AB&AD is:%f\n', theta_AD_AB*180/pi);
v = cross(AB,CD);
t = -dot(AC, v) / norm(v)^2;
d = C + tv;
Ad = d - A;
theta_Ad_AB = acos(dot(AB, Ad) / (norm(AB) * norm(Ad)));
fprintf('The Angle of AB&Ad is:%f\n', theta_Ad_AB180/pi-90);
figure,
plot3(A(1), A(2), A(3), 'r')
hold on,
plot3(B(1), B(2), B(3), 'g')
hold on,
plot3(C(1), C(2), C(3), 'b')
hold on,
plot3(D(1), D(2), D(3), 'k')
hold on,
plot3(d(1), d(2), d(3), '*', 'Color',[0, 1, 1])
hold on,
plot3([A(1),B(1)], [A(2),B(2)],[A(3),B(3)], 'r')
hold on,
plot3([A(1),C(1)], [A(2),C(2)],[A(3),C(3)], 'g')
hold on,
plot3([A(1),D(1)], [A(2),D(2)],[A(3),D(3)], 'b')
hold on,
plot3([B(1),D(1)], [B(2),D(2)],[B(3),D(3)], 'k')
hold on,
plot3([C(1),D(1)], [C(2),D(2)],[C(3),D(3)], 'Color',[1, 1, 0])
hold on,
plot3([C(1),B(1)], [C(2),B(2)],[C(3),B(3)], 'Color',[0, 1, 1])
xlabel('x')
ylabel('y')
zlabel('z')
axis equal
%%
%%%% 其他计算方法
% 计算向量 v 和 d
P1 = A;
P2 = B;
P = C;
v = [P(1) - P1(1), P(2) - P1(2), P(3) - P1(3)];
d = [P2(1) - P1(1), P2(2) - P1(2), P2(3) - P1(3)];
% 计算投影长度 p 的分子部分
numerator = dot(v, d);
denominator = norm(d)^2;
% 计算投影长度 p 的绝对值(D如果需要非负值)
p = max(0, min(numerator / denominator, 1)) * norm(d); % 限制在 [0, 1] 内
% 计算距离 d(P, L)
d = norm(v) - p;
90 - atan(dsin(theta)/(A(1) - C(1)))180/pi
crossProduct = cross(AB, AC);
dist = norm(crossProduct) / norm(AB)
90 - atan(distsin(theta)/(A(1) - C(1)))180/pi