首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

[HDU 4741]Save Labman No.004[计算几何][精密度]

2013-09-16 
[HDU 4741]Save Labman No.004[计算几何][精度]题意:求两条空间直线的距离,以及对应那条距离线段的两端点

[HDU 4741]Save Labman No.004[计算几何][精度]

题意:

求两条空间直线的距离,以及对应那条距离线段的两端点坐标.

思路:

有一个参数方程算最短距离的公式, 代入求即可.


但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算出b直线上到a最近的点q的坐标, 再求这两点距离)用double可以过, 直接参数方程的公式用long double才可以><而且下来交的时候..C++->WA,G++->AC...


long double

#include <cstdio>#include <cstring>#include <stack>#include <iostream>#include <cmath>#define inf 1000000000using namespace std;double x[5], y[5], z[5];double xx, yy, zz, xxx, yyy, zzz;double cal(double a, double b, double c, double d, double e, double f){    return (sqrt((d-a)*(d-a)+(e-b)*(e-b)+(f-c)*(f-c)));}int main(){    int cas;    double A, B, C, D, E, F, o, aa, bb, cc, k;    scanf("%d", &cas);    while (cas--) {        for (int i=1; i<=4; i++)            scanf("%lf%lf%lf", &x[i], &y[i], &z[i]);        A=x[2]-x[1]; B=y[2]-y[1]; C=z[2]-z[1];        D=x[4]-x[3]; E=y[4]-y[3]; F=z[4]-z[3];        aa=A*B*E-B*B*D-C*C*D+A*C*F;        bb=A*A*E-A*B*D-B*C*F+C*C*E;        cc=A*C*D-A*A*F-B*B*F+B*C*E;        o=-x[1]*aa+y[1]*bb-z[1]*cc;        k=(bb*y[3]-aa*x[3]-cc*z[3]-o)/(aa*D-bb*E+cc*F);        xxx=D*k+x[3]; yyy=E*k+y[3]; zzz=F*k+z[3];        A=x[4]-x[3]; B=y[4]-y[3]; C=z[4]-z[3];        D=x[2]-x[1]; E=y[2]-y[1]; F=z[2]-z[1];        aa=A*B*E-B*B*D-C*C*D+A*C*F;        bb=A*A*E-A*B*D-B*C*F+C*C*E;        cc=A*C*D-A*A*F-B*B*F+B*C*E;        o=-x[3]*aa+y[3]*bb-z[3]*cc;        k=(bb*y[1]-aa*x[1]-cc*z[1]-o)/(aa*D-bb*E+cc*F);        xx=D*k+x[1]; yy=E*k+y[1]; zz=F*k+z[1];        printf("%.6lf\n", cal(xx, yy, zz, xxx, yyy, zzz));        printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", xx, yy, zz, xxx, yyy, zzz);    }    return 0;}

<代码非原创orz>

热点排行