首页 > 试题广场 >

【计算三维空间中两条直线间的最短距离】 问题描述: 已知三维

[问答题]
【计算三维空间中两条直线间的最短距离】
问题描述: 
已知三维空间中任意两条直线AB、CD上两点坐标分别为A(Xa , Ya, Za)、B( Xb,Yb ,Zb )、C(Xc ,Yc ,Zc )、D(Xd ,Yd ,Zd )。求直线AB上任一点 与直线CD上任一点之间的最短距离。 

输入描述: 
1 0 0 ------ A点坐标(Xa=1 Ya=0 Za=0) 
2 0 0 ------ B点坐标(Xb=2 Yb=0 Zb=0) 
0 1 2 ------ C点坐标(Xc=0 Yc=1 Zc=2) 
0 2 2 ------ D点坐标(Xd=0 Yd=2 Zd=2) 

输出描述: 
2 ----- 直线AB与CD之间的最短距离 

输入样例:
1 0 0 
2 0 0 
0 1 2 
0 2 2 

输出样例: 

叉乘找法向量,AC投影求长度
#include <cmath>
#include <cstdio>
#include <vector>
using namespace std;

struct Point {
    float x, y, z;
};

Point point2vector(const Point &point1, const Point &point2) {
    Point vec{point1.x - point2.x, point1.y - point2.y, point1.z - point2.z};
    return vec;
}

Point cross(const Point &point1, const Point &point2) {
    float i = point1.y * point2.z - point1.z * point2.y;
    float j = point1.z * point2.x - point1.x * point2.z;
    float k = point1.y * point2.x - point1.x * point2.y;
    return {i, j, k};
}

float dot(const Point &point1, const Point &point2) {
    return point1.x * point2.x + point1.y * point2.y + point1.z * point2.z;
}

float norm(const Point &point) {
    return sqrt(point.x * point.x + point.y * point.y + point.z * point.z);
}

int main() {
    vector<Point> points;
    float x, y, z;
    while (scanf("%f %f %f", &x, &y, &z) != EOF) {
        points.push_back({x, y, z});
    }
    Point A = points[0], B = points[1], C = points[2], D = points[3];
    Point vecAB = point2vector(B, A), vecCD = point2vector(D, C), vecAC = point2vector(C, A);
    Point vecN = cross(vecAB, vecCD);
    float dis = abs(dot(vecAC, vecN)) / norm(vecN);
    printf("%f", dis);
    return 0;
}


发表于 2023-09-02 00:11:42 回复(0)
找公垂线
发表于 2023-08-10 18:00:05 回复(1)