题目:hdu 4741 Save Labman No.004
思路:异面直线公垂线。 click_here
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
double H,I,J,K,L,M,N,O,P,Q;
struct point
{
double x,y,z;
}p[4],q[4];
double sq(double tmp)
{
return tmp*tmp;
}
vector<double>v;
vector<double> solve(point p[])
{
v.clear();
H = p[1].x-p[0].x;
I = p[1].y-p[0].y;
J = p[1].z-p[0].z;
K = p[3].x-p[2].x;
L = p[3].y-p[2].y;
M = p[3].z-p[2].z;
N = H*I*L - I*I*K - J*J*K + H*J*M ;
O = H*H*L - H*I*K - I*J*M + J*J*L ;
P = H*J*K - H*H*M - I*I*M + I*J*L ;
Q = -p[0].x*N + p[0].y*O - p[0].z*P ;
double k = O*p[2].y - N*p[2].x - P*p[2].z - Q ,x,y,z;
k /= (N*K - O*L + P*M);
x=K*k+p[2].x;
y=L*k+p[2].y;
z=M*k+p[2].z;
v.push_back(x);
v.push_back(y);
v.push_back(z);
return v;
}
double dis(vector<double>v1,vector<double>v2)
{
double tmp=0;
for(int i=0;i<v1.size();i++)
tmp+=sq(v1[i]-v2[i]);
return sqrt(tmp);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
for(int i=0;i<4;i++)
{
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
q[3-i].x=p[i].x;
q[3-i].y=p[i].y;
q[3-i].z=p[i].z;
}
vector<double>v1=solve(p),v2=solve(q);
printf("%.6lf\n",dis(v1,v2));
for(int i=0;i<v2.size();i++)
printf("%.6lf ",v2[i]);
for(int i=0;i<v1.size()-1;i++)
printf("%.6lf ",v1[i]);
printf("%.6lf\n",v1[v1.size()-1]);
}
return 0;
}