本文参考下面这篇文章的计算方法,使用C++实现了两异面直线公垂线垂足位置的计算
http://wenku.baidu.com/view/44c4aa07bd64783e09122b91.html?re=view
这篇文章是1990年刊登的,奇怪的是我在搜索过程中发现的这篇文章的第三作者在2002年随便改了一下标题,内容几乎一字不差的发表在另一篇期刊上
http://www.doc88.com/p-3425370084181.html,但是我比较了这两篇文章,发现后者在依葫芦画瓢的过程中抄错了很多字母和符号,所以我们以第一篇文章为准。
在算法实现过程中需要用到大量行列式的计算,最高阶不超过三阶,可以自己编写求解行列式值的程序,在这里我使用的是Eigen开源矩阵库,这个库不需要安装,只要下载下来将路径添加到附加包含目录即可。
1 #include<iostream>
2 #include <Eigen/Dense>
3
4
5 void main()
6 {
7
8 //参考文献《异面直线公垂线的垂足位置》
9
10 float x1, y1, z1, m1, n1, p1;//直线1上一点及其方向向量
11 float x2, y2, z2, m2, n2, p2;//直线2上一点及其方向向量
12
13 x1 = 0; y1 = 1, z1 = 0; m1 = 0; n1 = 1; p1 =0;
14
15 x2 = 1; y2 = 1; z2 = 1; m2 = 1; n2 =1; p2 = 0;
16
17 float G[3], H[3];//存储两个垂足的坐标
18 Eigen::MatrixXf A1(2, 2), B1(2, 2), C1(2, 2), A2(2, 2), B2(2, 2), C2(2, 2);
19 float a1, b1, c1, a2, b2, c2;//存储上述矩阵的行列式的值
20
21 A1 << n1, p1, n2, p2;
22 B1 << p1, m1, p2, m2;
23 C1 << m1, n1, m2, n2;
24
25 a1 = A1.determinant();
26 b1 = B1.determinant();
27 c1 = C1.determinant();
28
29 A2 << n2, b1, p2, c1;
30 B2 << p2, c1, m2, a1;
31 C2 << m2, a1, n2, b1;
32
33 a2 = A2.determinant();
34 b2 = B2.determinant();
35 c2 = C2.determinant();
36
37 Eigen::MatrixXf W1(3, 3);
38 W1 << a1, b1, c1, a2, b2, c2, n1, -m1, 0;
39
40 float w1 = W1.determinant();
41 float d1 = a2*(x2 - x1) + b2*(y2 - y1) + c2*(z2 - z1);
42
43 G[0] = x1 - d1*m1 * c1 / w1;
44 G[1] = y1 - d1*n1 * c1 / w1;
45 G[2] = z1 + d1*(a1*m1 + b1*n1) / w1;
46
47 float a3, b3, c3;
48 a3 = n1*(m1*n2 - m2*n1) + p1*(m1*p2 - p1*m2);
49 b3 = p1*(n1*p2 - n2*p1) + m1*(n1*m2 - n2*m1);
50 c3 = m1*(p1*m2 - p2*m1) + n1*(p1*n2 - p2*n1);
51
52 float w2 = n2*(b1*c3 - b3*c1) + m2*(a1*c3 - a3*c1);
53 float d2 = a3*(x1 - x2) + b3*(y1 - y2) + c3*(z1 - z2);
54
55 H[0] = x2 - d2*m2*c1 / w2;
56 H[1] = y2 - d2*n2*c1 / w2;
57 H[2] = z2 + d2*(a1*m2 + b1*n2) / w2;
58
59 std::cout << "垂足坐标G:" << G[0] << " " << G[1] << " " << G[2] << std::endl;
60 std::cout << "垂足坐标H:" << H[0] << " " << H[1] << " " << H[2] << std::endl;
61
62 }
原文链接: https://www.cnblogs.com/star91/p/4751933.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/220989
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!