首页 > 其他 > 详细

空间两条线段最短距离

时间:2021-04-25 14:04:35      阅读:13      评论:0      收藏:0      [点我收藏+]

#include <iostream>

using namespace std;

typedef struct
{
double x, y, z;
}Point,Vector;

typedef struct
{
Point p1, p2;
}LineSegMent;

//向量减法
Vector sub(Vector v1, Vector v2)
{
return Vector{ v1.x - v2.x,v1.y - v2.y,v1.z - v2.z };
}

//向量加法
Vector add(Vector v1, Vector v2)
{
return Vector{ v1.x + v2.x,v1.y + v2.y,v1.z + v2.z };
}

//向量点积
double mul(Vector v1, Vector v2)
{
return double{ v1.x * v2.x + v1.y * v2.y + v1.z * v2.z };
}

//向量数乘
Vector mul(double d, Vector v1)
{
return Vector{ d * v1.x,d * v1.y,d * v1.z };
}

//两点之间的距离
double distance(Point p1, Point p2)
{
return double((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y) + (p1.z - p2.z) * (p1.z - p2.z));
}

//向量模长
double distance(Point p1)
{
return double(p1.x * p1.x + p1.y * p1.y + p1.z * p1.z);
}
double dis(LineSegMent l1, LineSegMent l2)
{
//向量
Vector v1, v2;
v1 = sub(l1.p2, l1.p1), v2 = sub(l2.p2, l2.p1);

//参数t1,参数t2
double t1, t2;

t1 = (mul(v1, v2) * mul(sub(l1.p1, l2.p1), v2) - distance(v2) * (mul(v1, sub(l1.p1, l2.p1))))
/ ((distance(v1) * distance(v2)) - (mul(v1, v2) * mul(v1, v2)));
t2 = (mul(v1, v2) * mul(sub(l1.p1, l2.p1), v1) - distance(v1) * (mul(v2, sub(l1.p1, l2.p1))))
/ ((distance(v1) * distance(v2)) - (mul(v1, v2) * mul(v1, v2)));
t2 = -t2;
//cout << t1 << "《---》" << t2 << endl;
double d1;
if ((t1 >= 0 && t1 <= 1) && (t2 >= 0 && t2 <= 1))
{
Vector v = sub(add(l1.p1, mul(t1, v1)), add(l2.p1, mul(t2, v2)));
d1 = distance(v);
}
else
{

d1 = distance(l1.p1, l2.p1); cout << d1 << "===" << endl;
d1 = min(d1, distance(l1.p1, l2.p2)); cout << distance(l1.p1, l2.p2) << "===" << endl;
d1 = min(d1, distance(l1.p2, l2.p1)); cout << distance(l1.p2, l2.p1) << "===" << endl;
d1 = min(d1, distance(l1.p2, l2.p2)); cout << distance(l1.p2, l2.p2) << "===" << endl;
}

return d1;
}

int main()
{
//线段
LineSegMent l1, l2;
printf_s("请输入第一条线段:\n");
scanf_s("%lf%lf%lf%lf%lf%lf", &l1.p1.x, &l1.p1.y, &l1.p1.z, &l1.p2.x, &l1.p2.y, &l1.p2.z);
printf_s("请输入第二条线段:\n");
scanf_s("%lf%lf%lf%lf%lf%lf", &l2.p1.x, &l2.p1.y, &l2.p1.z, &l2.p2.x, &l2.p2.y, &l2.p2.z);

double d1 = dis(l1,l2);
printf("距离:%.2f\n", d1);
return 0;
}

//测试数据
/*
0 0 4 4 0 0
0 4 0 7 4 0

0 0 4 4 0 0
7 4 0 10 4 0

0 8 0 6 8 0
8 8 0 10 8 0

4 0 0 4 0 4
0 2 0 4 5 0

4 0 0 4 0 -4
0 2 0 4 5 0
*/

空间两条线段最短距离

原文:https://www.cnblogs.com/jyzmlc/p/14699758.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!