题目链接

抄的模版。。。mark一下。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
#define eps 1e-10
#define zero(x) (((x) > 0?(x):(-x)) < eps)
struct point3
{
double x,y,z;
};
struct line3
{
point3 a,b;
};
struct plane3
{
point3 a,b,c;
};
point3 xmult(point3 u,point3 v)
{
point3 ret;
ret.x = u.y*v.z - v.y*u.z;
ret.y = u.z*v.x - u.x*v.z;
ret.z = u.x*v.y - u.y*v.x;
return ret;
}
point3 subt(point3 u,point3 v)
{
point3 ret;
ret.x = u.x - v.x;
ret.y = u.y - v.y;
ret.z = u.z - v.z;
return ret;
}
double dmult(point3 u,point3 v)
{
return u.x*v.x + u.y*v.y + u.z*v.z;
}
double vlen(point3 p)
{
return sqrt(p.x*p.x + p.y*p.y + p.z*p.z);
}
double linetoline(line3 u,line3 v)
{
point3 n = xmult(subt(u.a,u.b),subt(v.a,v.b));
return fabs(dmult(subt(u.a,v.a),n))/vlen(n);
}
point3 intersection(line3 u,line3 v)
{
point3 ret = u.a;
double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))
/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
ret.x += (u.b.x-u.a.x)*t;
ret.y += (u.b.y-u.a.y)*t;
ret.z += (u.b.z-u.a.z)*t;
return ret;
} //求面线交点
point3 pvec(plane3 s)
{
return xmult(subt(s.a,s.b),subt(s.b,s.c));
}
point3 intersection(line3 l,plane3 s)
{
point3 ret = pvec(s);
double t = (ret.x*(s.a.x-l.a.x)+ret.y*(s.a.y-l.a.y)+ret.z*(s.a.z-l.a.z))/
(ret.x*(l.b.x-l.a.x)+ret.y*(l.b.y-l.a.y)+ret.z*(l.b.z-l.a.z));
ret.x = l.a.x + (l.b.x-l.a.x)*t;
ret.y = l.a.y + (l.b.y-l.a.y)*t;
ret.z = l.a.z + (l.b.z-l.a.z)*t;
return ret;
}
int dots_oneplane(point3 a,point3 b,point3 c,point3 d)
{
plane3 temp;
temp.a = a;
temp.b = b;
temp.c = c;
return zero(dmult(pvec(temp),subt(d,a)));
}
int main()
{
int t;
double ans;
scanf("%d",&t);
line3 u,v,te,ni;
point3 st,u1,v1,ans1,ans2;
plane3 ds;
while(t--)
{
scanf("%lf%lf%lf",&u.a.x,&u.a.y,&u.a.z);
scanf("%lf%lf%lf",&u.b.x,&u.b.y,&u.b.z);
scanf("%lf%lf%lf",&v.a.x,&v.a.y,&v.a.z);
scanf("%lf%lf%lf",&v.b.x,&v.b.y,&v.b.z);
if(dots_oneplane(u.a,u.b,v.a,v.b))
{
printf("0.000000\n");
ans1 = ans2 = intersection(u,v);
printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z);
continue;
}
ans = linetoline(u,v);
printf("%.6lf\n",ans);
st = xmult(subt(u.a,u.b),subt(v.a,v.b));
ds.a = v.a;
ds.b = v.b;
ds.c.x = v.a.x + (u.a.x-u.b.x);
ds.c.y = v.a.y + (u.a.y-u.b.y);
ds.c.z = v.a.z + (u.a.z-u.b.z); te.a = u.a;
te.b.x = u.a.x + st.x;
te.b.y = u.a.y + st.y;
te.b.z = u.a.z + st.z;
u1 = intersection(te,ds);
v1.x = u1.x + (u.a.x-u.b.x);
v1.y = u1.y + (u.a.y-u.b.y);
v1.z = u1.z + (u.a.z-u.b.z);
ni.a = u1;
ni.b = v1;
ans1 = intersection(ni,v);
ans2.x = ans1.x + (u.a.x - u1.x);
ans2.y = ans1.y + (u.a.y - u1.y);
ans2.z = ans1.z + (u.a.z - u1.z);
printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",ans2.x,ans2.y,ans2.z,ans1.x,ans1.y,ans1.z);
}
return ;
}

最新文章

  1. 浏览器-06 HTML和CSS解析2
  2. MongoDB 副本集管理(不定时更新)
  3. 01_Swift2基础之Swift简介+创建
  4. python3 reqeuests给OSC全站用户刷积分
  5. Oracle 游标使用(转)
  6. [react native] Error loading page
  7. LR_问题_无法使用LR的Controller,提示缺少license
  8. HTML5与CSS3基础教程第八版学习笔记7~10章
  9. JS如果阻止事件冒泡和浏览器默认事件
  10. Struts2 DMI的使用
  11. soap和http(转)
  12. 今年暑假不AC1
  13. 一步一步学习Vue(十)
  14. FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现
  15. FEX(Fabric Extender)
  16. JAVA发送HttpClient请求及接收请求结果
  17. [JOISC2014]友だちをつくろう
  18. java JDBC (八) 连接池 DBCP
  19. JKS和PFX文件相互转换方法
  20. Python 调用datetime或者time获取时间的时候以及时间转换,最好设置一下时区 否则会出现相差8个小时的情况

热门文章

  1. HTML5学习之跨文档传输消息(七)
  2. Delphi按下F1不能出现帮助文档的解决方法
  3. 编程风格规范google版
  4. 【JAVA多线程概述】
  5. Acdream 1111:LSS(水题,字符串处理)
  6. MySQL5.6 on Windows 安装失败: String was not recognized as a valid DateTime
  7. Oracle【IT实验室】数据库备份与恢复之四:RMAN(备份与恢复管理器)
  8. 禁用编译器自动生成的函数(Effective C++之06)
  9. [Liferay6.2]核心配置文件portal.properties
  10. loj 1337