http://acm.hdu.edu.cn/showproblem.php?pid=4741
题目是输入四个点,然后确定了两条直线,然后求异面直线的距离,还有离得最近的那两个点。
纯数学题,套套数学公式就可以了。
#include "stdio.h"
#include "math.h"
typedef struct POINT
{
double x;
double y;
double z;
}Point;
Point a,b,c,d;
Point m,n;
double sjhls( double a1, double b1, double c1, double a2, double b2, double c2, double a3, double b3, double c3 )
{
return a1*b2*c3 + a3*b1*c2 + a2*b3*c1 - a3*b2*c1 - a2*b1*c3 -a1*b3*c2;
}
int main()
{
int t;
scanf( "%d", &t );
while( t-- && scanf( "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a.x,&a.y,&a.z, &b.x,&b.y,&b.z, &c.x,&c.y,&c.z, &d.x,&d.y,&d.z ) == 12 )
{
double m1 = a.x - b.x;
double n1 = a.y - b.y;
double p1 = a.z - b.z;
double m2 = c.x - d.x;
double n2 = c.y - d.y;
double p2 = c.z - d.z;
double x1 = a.x, y1 = a.y, z1 = a.z;
double x2 = c.x, y2 = c.y, z2 = c.z;
double t11 = sjhls( n1*p2-n2*p1, x2-x1, m2, p1*m2-p2*m1, y2-y1, n2, m1*n2-m2*n1, z2-z1, p2 );
double t22 = sjhls( n1*p2-n2*p1, m1, x2-x1, p1*m2-p2*m1, n1, y2-y1, m1*n2-m2*n1, p1, z2-z1 );
double t = sjhls( n1*p2-n2*p1, m1, m2, p1*m2-p2*m1, n1, n2, m1*n2-m2*n1, p1, p2 );
double t1 = t11/t;
double t2 = -t22/t;
m.x = x1 + m1 * t1;
m.y = y1 + n1 * t1;
m.z = z1 + p1 * t1;
n.x = x2 + m2 * t2;
n.y = y2 + n2 * t2;
n.z = z2 + p2 * t2;
double ans = sqrt( ( x2-x1+m2*t2-m1*t1 )*( x2-x1+m2*t2-m1*t1 ) + ( y2-y1+n2*t2-n1*t1 )*( y2-y1+n2*t2-n1*t1 ) + ( z2-z1+p2*t2-p1*t1 )*( z2-z1+p2*t2-p1*t1 ) );
printf( "%.6f\n", ans );
printf( "%.6f %.6f %.6f %.6f %.6f %.6f\n", m.x,m.y,m.z, n.x,n.y,n.z );
}
return 0;
}