標籤:oss c++ tail include sha ref article url 座標
關鍵詞:空間幾何
用途:總有地方會用到吧
文章類型:C++函數展示
@Author:V_Shawn
@Date:2016-11-19
@Lab: [email protected]
對於空間內的兩條直線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-22class 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/11820545double 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座標
下載:
https://1drv.ms/u/s!AmjBsmo7u4eFmDpYL9FSBJurEQQ7
求空間內兩條直線的最近距離以及最近點的座標(C++)