HDU 4617 Weapon (计算几何:异面直线距离)
来源:互联网 发布:淘宝下载安装到桌面 编辑:程序博客网 时间:2024/05/13 17:06
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4617
题意:给出空间内的n个圆的圆心及圆上两点,即n个无限延长的光柱的截面,问这些圆柱是否会交在一起,如果不交输出最短距离,否则输出"Lucky"
思路:对于每个圆,找出其法向量直线,这样每两条法向量直线的间距减去两圆的半径和即是距离,判断该距离是否<=0即可
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <utility>#include <functional>#include <vector>#include <queue>#include <string>#include <set>#include <map>#pragma comment (linker, "/STACK:1024000000,1024000000")#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1#define eps 1e-8#define sign(x) ((x) > eps ? 1 : ((x) < -eps ? (-1) : (0)))using namespace std;typedef long long ll;int n;struct point{ double x, y, z; point() {} point(double _x, double _y, double _z) { x = _x; y = _y; z = _z; } void input() { scanf("%lf%lf%lf", &x, &y, &z); } point operator + (const point &b) const { return point(x + b.x, y + b.y, z + b.z); }};struct line{ point a, b;};struct circle{ point o, p1, p2; void input() { o.input(); p1.input(); p2.input(); }} c[100];point xmult(point u, point v){ point 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;}double dis(point u, point v){ return sqrt((u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y) + (u.z - v.z) * (u.z - v.z));}double dmult(point u, point v){ return u.x * v.x + u.y * v.y + u.z * v.z;}point sub(point u, point v){ point ret; ret.x = u.x - v.x; ret.y = u.y - v.y; ret.z = u.z - v.z; return ret;}double vlen(point p){ return sqrt(p.x * p.x + p.y * p.y + p.z * p.z);}point pvec(circle s){ return xmult(sub(s.o, s.p1), sub(s.p1, s.p2));}double linedis(line u, line v){ point n = xmult(sub(u.a, u.b), sub(v.a, v.b)); return fabs(dmult(sub(u.a, v.a), n)) / vlen(n);}void solve(){ double ans = 1e9; for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { circle c1 = c[i], c2 = c[j]; double r1 = dis(c[i].o, c[i].p1); double r2 = dis(c[j].o, c[j].p1); point k1 = pvec(c1); point k2 = pvec(c2); line l1, l2; l1.a = c1.o, l1.b = k1 + c1.o; l2.a = c2.o, l2.b = k2 + c2.o; double d = linedis(l1, l2); if(sign(d - r1 - r2) <= 0) { puts("Lucky"); return ; } ans = min(ans, d - r1 - r2); } } printf("%.2f\n", ans);}int main(){ int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 0; i < n; i++) c[i].input(); solve(); } return 0;}
0 0
- HDU 4617 Weapon (计算几何:异面直线距离)
- Hdu 4617 Weapon (三维计算几何 异面直线距离)
- HDU 4617 Weapon(计算几何、三维直线距离)
- hdu 4617 Weapon【异面直线距离——基础三维几何】
- hdu 4617 Weapon 计算异面直线间距离
- HDU 4617Weapon(两条异面直线的距离)
- hdu 4617 Weapon(几何)
- HDU 4617 Weapon(立体计算几何)
- HDU 4617 Weapon (三维计算几何)
- hdu 4617 Weapon (几何)
- Hdu 4617 立体几何 异面直线距离
- hdu 4617 2013多校联合训练第二场weapon简单的计算几何
- HDU 4617 Weapon (立体几何)
- hdu4671异面直线距离
- HDU 4741 Save Labman No.004 (异面直线距离&直线与平面的交点)
- ZOJ 3157 Weapon --计算几何+树状数组
- HDU 4741 空间几何求两直线距离最近点
- hdu 4617 : Weapon
- Hduoj1024【DP】
- 2013access如何创建表和关系
- 一个python写的生产者(Producer)和消费者(Consumer)问题
- 信息检索导论(王斌译)
- 稳定排序和不稳定排序
- HDU 4617 Weapon (计算几何:异面直线距离)
- JSON与对象(枚举类对象)之间的相互转换
- Android学习资源、进阶之路贵在坚持
- 10.3 接收缓存管理
- Uva1586 - Molar mass
- Python2.7 64位 安装
- 点击popupwindow以外区域 popupwindow自动消失
- Strom实时计算--简述
- opencv2 kmeans算法 应用