[ACM_几何] The Deadly Olympic Returns!!! (空间相对运动之最短距离)

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/B

题目大意: 有两个同时再空间中匀速运动的导弹,告诉一个时间以及各自的初始坐标和该时间时的坐标,求运动过程中的最短距离
解题思路:  求出相对初位置、相对速度,则答案就是原点到射线型轨迹的距离,注意是射线!!!

 

//*******************************************************************************

#include<iostream>

#include<algorithm>

#include<cmath>

#include<stdio.h>

using namespace std;

#define eps 1e-8



int dcmp(double x){

    if(fabs(x)<eps)return 0;

    else return x<0 ? -1:1;

}



struct Point3{

    double x,y,z;

    Point3(double x=0,double y=0,double z=0):x(x),y(y),z(z){}

    

};

bool operator==(const Point3& a,const Point3& b){

    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0 && dcmp(a.z-b.z)==0 ;

}

typedef Point3 Vector3;

Vector3 operator+(Vector3 A,Vector3 B){

    return Vector3(A.x+B.x,A.y+B.y,A.z+B.z);

}

Vector3 operator-(Vector3 A,Vector3 B){

    return Vector3(A.x-B.x,A.y-B.y,A.z-B.z);

}

Vector3 operator*(Vector3 A,double p){

    return Vector3(A.x*p,A.y*p,A.z*p);

}

Vector3 operator/(Vector3 A,double p){

    return Vector3(A.x/p,A.y/p,A.z/p);

}



double Dot(Vector3 A,Vector3 B){return A.x*B.x+A.y*B.y+A.z*B.z;}

double Length(Vector3 A){return sqrt(Dot(A,A));}

double Angle(Vector3 A,Vector3 B){return acos(Dot(A,B)/Length(A)/Length(B));}

//叉积

Vector3 Cross(Vector3 A,Vector3 B){

    return Vector3(A.y*B.z-A.z*B.y,A.z*B.x-A.x*B.z,A.x*B.y-A.y*B.x);

}

//点p到射线AB的距离

double DDSXJL(Point3 p,Point3 A,Point3 B){

    if(A==B)return Length(p-A);

    Vector3 v1=B-A,v2=p-A;

    if(dcmp(Dot(v1,v2))<0)return Length(v2);

    else return Length(Cross(v1,v2))/Length(v1);

}

//******************************************************************************

int main(){

    Point3 now[2],fut[2],delta;

    int T;cin>>T;

    

    for(int kase=1;kase<=T;kase++){



        int time;cin>>time;

        cin>>now[0].x>>now[0].y>>now[0].z;

        cin>>fut[0].x>>fut[0].y>>fut[0].z;

        cin>>now[1].x>>now[1].y>>now[1].z;

        cin>>fut[1].x>>fut[1].y>>fut[1].z;



        Point3 B;//坐标原点

        delta=now[1]-now[0];//相对初位置

        Vector3 speed=((fut[1]-now[1])-(fut[0]-now[0]));//相对速度

        printf("Case %d: %.4lf\n",kase,DDSXJL(B,delta,delta+speed));//答案就是原点到轨迹的距离

    }return 0;



}

//*******************************************************************************
View Code

 

你可能感兴趣的:(return)