关键词:空间几何

用途:总有地方会用到吧

文章类型: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. Python之路----------ConfigParser模块

    Python的ConfigParser 废话不说,拿去用 #coding=utf-8 import configparser ''' 基於Python3.0版本寫的配置文件的創建.增加.刪除.修改等方 ...

  2. Windows下通过socket进行字符串和文件传输

    今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...

  3. memcpy内存复制

    memcpy(predata,frame,1920*1080*4);

  4. sprint 3 总结

    1.要求: 演示可参考毕业设计答辩,包含两部分内容: 项目陈述,可综述项目.团队.开发过程等. 运行演示,实现的功能.业务.用户反馈等. 希望各组认真准备,拿出最好的阵容最好的状态,展示一学期的学习与 ...

  5. CentOS双网卡绑定bond0

    a)拷⻉并配置vim /etc/sysconfig/network-scripts/ifcfg-bond0配置⽂件(会自动创建文件) DEVICE=bond0 TYPE=Ethernet ONBOOT ...

  6. mysql 表迁移

    http://blog.csdn.net/evan_endian/article/details/8652528  mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发 ...

  7. MATLAB绘图

    matlab绘制散点图 clc,clear x=[11.9,11.5,14.5,15.2,15.9,16.3,14.6,12.9,15.8,14.1]; y=[196.84,196.84,197.14 ...

  8. CEGUI环境配置

    由于最近项目需要CEGUI做界面,于是我去下载了CEGUI源码,但是却不知道怎么搭建.网上的教程都不是很详细,不能让我们这种新手理解,经过几天折腾,终于弄好了,特此记录下来. 1.下载官网CEGUI源 ...

  9. HTML入门教程

    什么是 HTML?     HTML(Hyper Text Markup Language)超文本标记语言,是用来描述网页的一种语言,不是一种编程语言,而是一种标记语言 (markup languag ...

  10. java中的队列

    转载自:http://blog.csdn.net/guijava/article/details/3784658 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.Qu ...