zoukankan      html  css  js  c++  java
  • 两异面直线公垂线垂足位置的计算方法

     本文参考下面这篇文章的计算方法,使用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 }
  • 相关阅读:
    Linux文件与文件系统的压缩
    Linux命令与文件查找
    js兼容pc和移动端的简单拖拽效果
    图片懒加载插件
    css小特效
    创建对象和方法
    距离2021年春节还剩。。。
    固定尺寸的图片焦点图案例
    数据库操作
    简单sql操作
  • 原文地址:https://www.cnblogs.com/star91/p/4751933.html
Copyright © 2011-2022 走看看