关键词:空间几何

用途:总有地方会用到吧

文章类型:C++函数展示

@Author:VShawn(singlex@foxmail.com)

@Date:2016-11-19

@Lab: CvLab202@CSU

对于空间内的两条直线A,B我假设他们一定不平行,也不相交。若已知A上两点A1、A2,B上两点B1、B2,那么可以很容易得到两条直线的方程。

然后调用函数即可解得结果:

下面提供了一个用于解决这个问题的类:

#include <math.h>

//用于求解两条空间直线的最近距离,以及他们最近的两点坐标
//author @vshawn
//url:http://www.cnblogs.com/singlex/p/6091659.html
//date:2016-11-22
class GetDistanceOf2linesIn3D
{
public:
//输入直线A的两个点,以便获得A的方程
void SetLineA(double A1x, double A1y, double A1z, double A2x, double A2y, double A2z)
{
a1_x = A1x;
a1_y = A1y;
a1_z = A1z; a2_x = A2x;
a2_y = A2y;
a2_z = A2z;
} //输入直线B的两个点,以便获得B的方程
void SetLineB(double B1x, double B1y, double B1z, double B2x, double B2y, double B2z)
{
b1_x = B1x;
b1_y = B1y;
b1_z = B1z; b2_x = B2x;
b2_y = B2y;
b2_z = B2z;
} //用SetLineA、SetLineB输入A、B方程后
//调用本函数解出结果
void GetDistance()
{
//方法来自:http://blog.csdn.net/pi9nc/article/details/11820545 double d1_x = a2_x - a1_x;
double d1_y = a2_y - a1_y;
double d1_z = a2_z - a1_z; double d2_x = b2_x - b1_x;
double d2_y = b2_y - b1_y;
double d2_z = b2_z - b1_z; double e_x = b1_x - a1_x;
double e_y = b1_y - a1_y;
double e_z = b1_z - a1_z; double cross_e_d2_x, cross_e_d2_y, cross_e_d2_z;
cross(e_x, e_y, e_z, d2_x, d2_y, d2_z, cross_e_d2_x, cross_e_d2_y, cross_e_d2_z);
double cross_e_d1_x, cross_e_d1_y, cross_e_d1_z;
cross(e_x, e_y, e_z, d1_x, d1_y, d1_z, cross_e_d1_x, cross_e_d1_y, cross_e_d1_z);
double cross_d1_d2_x, cross_d1_d2_y, cross_d1_d2_z;
cross(d1_x, d1_y, d1_z, d2_x, d2_y, d2_z, cross_d1_d2_x, cross_d1_d2_y, cross_d1_d2_z); double t1, t2;
t1 = dot(cross_e_d2_x, cross_e_d2_y, cross_e_d2_z, cross_d1_d2_x, cross_d1_d2_y, cross_d1_d2_z);
t2 = dot(cross_e_d1_x, cross_e_d1_y, cross_e_d1_z, cross_d1_d2_x, cross_d1_d2_y, cross_d1_d2_z);
double dd = norm(cross_d1_d2_x, cross_d1_d2_y, cross_d1_d2_z);
t1 /= dd*dd;
t2 /= dd*dd; //得到最近的位置
PonA_x = (a1_x + (a2_x - a1_x)*t1);
PonA_y = (a1_y + (a2_y - a1_y)*t1);
PonA_z = (a1_z + (a2_z - a1_z)*t1); PonB_x = (b1_x + (b2_x - b1_x)*t2);
PonB_y = (b1_y + (b2_y - b1_y)*t2);
PonB_z = (b1_z + (b2_z - b1_z)*t2); distance = norm(PonB_x - PonA_x, PonB_y - PonA_y, PonB_z - PonA_z);
} double PonA_x;//两直线最近点之A线上的点的x坐标
double PonA_y;//两直线最近点之A线上的点的y坐标
double PonA_z;//两直线最近点之A线上的点的z坐标
double PonB_x;//两直线最近点之B线上的点的x坐标
double PonB_y;//两直线最近点之B线上的点的y坐标
double PonB_z;//两直线最近点之B线上的点的z坐标
double distance;//两直线距离
private:
//直线A的第一个点
double a1_x ;
double a1_y ;
double a1_z ;
//直线A的第二个点
double a2_x ;
double a2_y ;
double a2_z ; //直线B的第一个点
double b1_x;
double b1_y ;
double b1_z ; //直线B的第二个点
double b2_x;
double b2_y ;
double b2_z ; //点乘
double dot(double ax, double ay, double az, double bx, double by, double bz) { return ax*bx + ay*by + az*bz; }
//向量叉乘得到法向量,最后三个参数为输出参数
void cross(double ax, double ay, double az, double bx, double by, double bz, double& x, double& y, double& z)
{
x = ay*bz - az*by;
y = az*bx - ax*bz;
z = ax*by - ay*bx;
}
//向量取模
double norm(double ax, double ay, double az) { return sqrt(dot(ax, ay, az, ax, ay, az)); }
};

使用方法:

		GetDistanceOf2linesIn3D g;//初始化
g.SetLineA(a1.x, a1.y, a1.z, a2.x, a2.y, a2.z);//输入直线A上的两个点坐标
g.SetLineB(b1.x, b1.y, b1.z, b2.x, b2.y, b2.z);//输入直线B上的两个点坐标
g.GetDistance();//计算距离
double d = g.distance;//获得距离
double x = g.PonA_x;//获得AB间最近的两点中A线上的点的x坐标
double y = g.PonA_y;//获得AB间最近的两点中A线上的点的y坐标
double z = g.PonA_z;//获得AB间最近的两点中A线上的点的z坐标

 

下载:

Onedrive:https://1drv.ms/u/s!AmjBsmo7u4eFmDpYL9FSBJurEQQ7

Git:https://github.com/vshawn/Shawn_pose_estimation_by_opencv/blob/master/include/GetDistanceOf2linesIn3D.h

求空间内两条直线的最近距离以及最近点的坐标(C++)的更多相关文章

  1. 两条直线(蓝桥杯)二分枚举+RMQ

    算法提高 两条直线   时间限制:1.0s   内存限制:256.0MB        问题描述 给定平面上n个点. 求两条直线,这两条直线互相垂直,而且它们与x轴的夹角为45度,并且n个点中离这两条 ...

  2. C# 判断两条直线距离

    本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...

  3. 2018-7-31-C#-判断两条直线距离

    title author date CreateTime categories C# 判断两条直线距离 lindexi 2018-07-31 14:38:13 +0800 2018-05-08 10: ...

  4. C++ 根据两点式方法求直线并求两条直线的交点

    Line.h #pragma once //Microsoft Visual Studio 2015 Enterprise //根据两点式方法求直线,并求两条直线的交点 #include"B ...

  5. 判断两条直线的位置关系 POJ 1269 Intersecting Lines

    两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...

  6. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

  7. 计算两条直线的交点(C#)

    PS:从其他地方看到的源码是有问题的.下面是修正后的 /// <summary> /// 计算两条直线的交点 /// </summary> /// <param name ...

  8. poj 1269(两条直线交点)

    Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13481   Accepted: 59 ...

  9. CodeForces - 961D:Pair Of Lines (几何,问两条直线是否可以覆盖所有点)

    You are given n points on Cartesian plane. Every point is a lattice point (i. e. both of its coordin ...

随机推荐

  1. Ubuntu Dev Box Setup

    Editor VIM Sublime Atom Visual Studio Code SSH Client PAC Manager File Manager Double Commander Imag ...

  2. linux上监控tomcat down掉后自动重启tomcat

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  3. Git 取消跟踪已版本控制的文件

    http://www.cnblogs.com/cposture/p/git.html 转: Git 是一个很好的版本控制工具,当然驾驭起来相比 SVN 要稍微复杂一些.初入 Git,难免有一些问题.比 ...

  4. 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  5. caffe学习笔记(一),ubuntu14.04+GPU (用Pascal VOC2007训练数据,并测试)

    把源代码跑起来了,将实验过程记录如下,用于新手入门. 今天和师兄师姐才跑通,来分享下心得.(预训练网络:ImageNet_model,训练集:PASCAL VOC2007, GPU) 首先,整个tra ...

  6. 自定义 JSON 对象

    针对 IE9 以下不支持 JSON 对象的处理方式,网上大部分自定义的方式无形之中都会将中文转码为 Unicode 编码格式的字符换,但是在浏览器中我们有无法察觉到(浏览器自己解析成 UTF8 了), ...

  7. Ideas about the future of management

    1. Business markets a. greater competition among companies b. increase in power of global companies ...

  8. UEFI Bootable USB Flash Drive - Create in Windows(WIN7 WIN8)

    How to Create a Bootable UEFI USB Flash Drive for Installing Windows 7, Windows 8, or Windows 8.1 In ...

  9. java中包命名常见规则

    做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读 ...

  10. ScrollView

    在程序设计中,有时我们需要实现自动滚屏或根据选择直接滚动到指定的位置的功能.这里用到的主要组件就是滚动视图(ScrollView). ---------- 那么使用ScrollView如何实现布局自动 ...