HDU 4617 Weapon 三维计算几何
题意:给你一些无限长的圆柱,知道圆柱轴心直线(根据他给的三个点确定的平面求法向量即可)与半径,判断是否有圆柱相交。如果没有,输出柱面最小距离。
一共只有30个圆柱,直接暴力一下就行。
判相交/相切:空间直线距离是否小于等于两圆柱半径和
若无相交,求最小:空间直线距离-两圆柱半径和
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- const double EPS = 1e-;
- const int MAXN = ;
- struct Point3 //空间点
- {
- double x, y, z;
- };
- struct Line3 //空间直线
- {
- Point3 a, b;
- };
- struct plane3 //空间平面
- {
- Point3 a, b, c;
- plane3(){}
- plane3( Point3 a, Point3 b, Point3 c ):
- a(a), b(b), c(c) { }
- };
- struct Cylinder
- {
- Point3 center; //圆柱轴线经过的一点
- Point3 a, b; //与中心点在同一平面的两点
- Line3 FaXian; //轴线
- double R; //圆柱半径
- };
- Cylinder CC[MAXN];
- Point3 Read_Point()
- {
- Point3 p;
- scanf("%lf%lf%lf", &p.x, &p.y, &p.z );
- return p;
- }
- double dcmp( double a )
- {
- if ( fabs( a ) < EPS ) return ;
- return a < ? - : ;
- }
- //三维叉积
- Point3 Cross3( 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;
- }
- //三维点积
- double Dot3( Point3 u, Point3 v )
- {
- return u.x * v.x + u.y * v.y + u.z * v.z;
- }
- //矢量差
- 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;
- }
- //取平面法向量
- Point3 NormalVector( plane3 s )
- {
- return Cross3( Subt( s.a, s.b ), Subt( s.b, s.c ) );
- }
- Point3 NormalVector( Point3 a, Point3 b, Point3 c )
- {
- return Cross3( Subt( a, b ), Subt( b, c ) );
- }
- //两点距离
- double TwoPointDistance( Point3 p1, Point3 p2 )
- {
- return sqrt( (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) + (p1.z - p2.z)*(p1.z - p2.z) );
- }
- //向量的模
- double VectorLenth( Point3 p )
- {
- return sqrt( p.x*p.x + p.y*p.y + p.z*p.z );
- }
- //空间直线距离
- double LineToLine( Line3 u, Line3 v )
- {
- Point3 tmp = Cross3( Subt( u.a, u.b ), Subt( v.a, v.b ) );
- return fabs( Dot3( Subt(u.a, v.a), tmp ) ) / VectorLenth(tmp);
- }
- int N;
- int main()
- {
- int T;
- scanf( "%d", &T );
- while ( T-- )
- {
- scanf( "%d", &N );
- for ( int i = ; i < N; ++i )
- {
- CC[i].center = Read_Point();
- CC[i].a = Read_Point();
- CC[i].b = Read_Point();
- CC[i].R = VectorLenth( Subt( CC[i].a, CC[i].center ) );
- CC[i].FaXian.a = CC[i].center;
- CC[i].FaXian.b = Subt( CC[i].center, NormalVector( CC[i].center, CC[i].a, CC[i].b ) );
- }
- bool ok = true;
- double MinAns = 1e200;
- for ( int i = ; ok && i < N; ++i )
- for ( int j = i + ; ok && j < N; ++j )
- {
- double tmp = LineToLine( CC[i].FaXian, CC[j].FaXian );
- if ( dcmp( tmp - ( CC[i].R + CC[j].R ) ) <= )
- {
- ok = false;
- break;
- }
- MinAns = min( MinAns, tmp - ( CC[i].R + CC[j].R ) );
- }
- if ( ok ) printf( "%.2f\n", MinAns );
- else puts("Lucky");
- }
- return ;
- }
HDU 4617 Weapon 三维计算几何的更多相关文章
- hdu 4617 Weapon【异面直线距离——基础三维几何】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4617 Weapon Time Limit: 3000/1000 MS (Java/Others) ...
- HDU 4617 Weapon (简单三维计算几何,异面直线距离)
Weapon Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ...
- HDU 4617 Weapon(三维几何)
Problem Description Doctor D. are researching for a horrific weapon. The muzzle of the weapon is a c ...
- hdu 4617 Weapon
http://acm.hdu.edu.cn/showproblem.php?pid=4617 三维几何简单题 多谢高尚博学长留下的模板 代码: #include <iostream> #i ...
- hdu 4617 Weapon(叉积)
大一学弟表示刚学过高数,轻松无压力. 我等学长情何以堪= = 求空间无限延伸的两个圆柱体是否相交,其实就是叉积搞一搞 详细点就是求两圆心的向量在两直线(圆心所在的直线)叉积上的投影 代码略挫,看他的吧 ...
- HDU 5130 Signal Interference(计算几何 + 模板)
HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
爆头 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
空间异面直线的距离直接套模板. 求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可.还是套模板o(╯□╰)o 1.不会有两条线平行的情况. 2.两条直线可能相 ...
- HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...
随机推荐
- 利用glassfish4任意文件读取拿权限的一些思路
只要讨论的是linux环境测试发现只针对GlassFish4,且基本上是已root运行的http://www.wooyun.org/bugs/wooyun-2010-0144595 zoomeye d ...
- 好书推荐——《Soft Skill》
这本书不是一本简单的叙述程序员职业规划和如何提高能力的书. 他论述了如何做一个高产,快乐,幸福的程序员,包括职业生涯,理财,学习,健身,信仰等各个方面的内容. 推荐给每一位伟大的拯救宇宙的程序员! 书 ...
- 【BZOJ】【2424】【HAOI2010】订货
网络流/费用流 比较简单的题……我一开始想成像软件开发那题一样的做法了……就是每天拆点,S->i (INF,0) .i+n->T (u[i],0) 然后处理购入 S->i+n (IN ...
- Leetcode#49 Anagrams
原题地址 Anagram:变位词.两个单词是变位词关系的条件是:组成单词的字符相同,只是顺序不同 第一次看这道题看了半天没明白要干嘛,丫就不能给个样例输入输出么..后来还是看网上其他人的总结知道是怎么 ...
- web项目首页提示404
我也是服了,估计是项目有问题,只能找jsp,找不到html和htm.把list中多余的都删掉,只保留index.jsp <welcome-file-list> <welcome-fi ...
- PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)
模型文档编辑器 PowerDesigner的模型文档(Model Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...
- ASP.Net 上传进度条的实现方法
对于加载时间比较长的ASP.NET页面,我们可以在客户端浏览器中显示进度条来显示页面正在装载.下面就是具体的实现过程: 新建项目,名字为WebPortal,在项目类型中选择Visual C#项目或者V ...
- 用 VIPER 构建 iOS 应用架构(1)
[编者按]本篇文章由 Jeff Gilbert 和 Conrad Stoll 共同编写,通过构建一个基础示例应用,深入了解 VIPER,并从视图.交互器等多个部件理清 VIPER 的整体布局及思路.通 ...
- MFC单文档程序结构
MFC单文档程序结构三方面: Doc MainFrame View
- HDU 4937 Lucky Number (数学,进制转换)
题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator fi ...