#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