hdu 4741 Save Labman No.004(2013杭州网络赛)
http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html
空间两直线上最近点对。
这个博客上给出了很好的点法式公式了。。。其实没有那么多的tricky。。。不知到别人怎么错的。。。
- //#pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<fstream>
- #include<sstream>
- #include<vector>
- #include<string>
- #include<cstdio>
- #include<bitset>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<map>
- #include<set>
- #define FF(i, a, b) for(int i=a; i<b; i++)
- #define FD(i, a, b) for(int i=a; i>=b; i--)
- #define REP(i, n) for(int i=0; i<n; i++)
- #define CLR(a, b) memset(a, b, sizeof(a))
- #define debug puts("**debug**")
- #define LL long long
- #define PB push_back
- #define MP make_pair
- #define eps 1e-10
- using namespace std;
- struct Point
- {
- double x, y, z;
- Point(double x=0, double y=0, double z=0) : x(x), y(y),z(z){}
- };
- typedef Point Vector;
- Vector operator + (Vector a, Vector b) { return Vector(a.x+b.x, a.y+b.y, a.z+b.z); };
- Vector operator - (Vector a, Vector b) { return Vector(a.x-b.x, a.y-b.y, a.z-b.z); };
- Vector operator * (Vector a, double p) { return Vector(a.x*p, a.y*p, a.z*p); }
- Vector operator / (Vector a, double p) { return Vector(a.x/p, a.y/p, a.z/p); }
- double Dot(Vector a, Vector b) { return a.x*b.x + a.y*b.y + a.z*b.z; }
- double Length(Vector a) { return sqrt(Dot(a, a)); }
- Vector Cross(Point a, Point b)
- {
- return Vector(a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x);
- }
- Point a1, b1, a2, b2;
- int main()
- {
- int n;
- scanf("%d", &n);
- while(n--)
- {
- scanf("%lf%lf%lf", &a1.x, &a1.y, &a1.z);
- scanf("%lf%lf%lf", &b1.x, &b1.y, &b1.z);
- scanf("%lf%lf%lf", &a2.x, &a2.y, &a2.z);
- scanf("%lf%lf%lf", &b2.x, &b2.y, &b2.z);
- Vector v1 = (a1-b1), v2 = (a2-b2);
- Vector N = Cross(v1, v2);
- Vector ab = (a1-a2);
- double ans = Dot(N, ab) / Length(N);
- Point p1 = a1, p2 = a2;
- Vector d1 = b1-a1, d2 = b2-a2;
- Point ans1, ans2;
- double t1, t2;
- t1 = Dot((Cross(p2-p1, d2)), Cross(d1, d2));
- t2 = Dot((Cross(p2-p1, d1)), Cross(d1, d2));
- double dd = Length((Cross(d1, d2)));
- t1 /= dd*dd;
- t2 /= dd*dd;
- ans1 = (a1 + (b1-a1)*t1);
- ans2 = (a2 + (b2-a2)*t2);
- printf("%.6f\n", fabs(ans));
- printf("%.6f %.6f %.6f ", ans1.x, ans1.y, ans1.z);
- printf("%.6f %.6f %.6f\n", ans2.x, ans2.y, ans2.z);
- }
- return 0;
- }
hdu 4741 Save Labman No.004(2013杭州网络赛)的更多相关文章
- HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...
- hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]
// Time 234 ms; Memory 244 K #include<iostream> #include<cstdio> #include<cmath> u ...
- HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4741 Save Labman No.004异面直线间的距离既构成最小距离的两个端点
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4741 Save Labman No.004(计算几何)
题目链接 抄的模版...mark一下. #include <iostream> #include <cstring> #include <cstdio> #incl ...
- [HDU 4741]Save Labman No.004[计算几何][精度]
题意: 求两条空间直线的距离,以及对应那条距离线段的两端点坐标. 思路: 有一个参数方程算最短距离的公式, 代入求即可. 但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算 ...
- hdu 4741 Save Labman No.004 (异面直线的距离)
转载学习: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorit ...
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
空间异面直线的距离直接套模板. 求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可.还是套模板o(╯□╰)o 1.不会有两条线平行的情况. 2.两条直线可能相 ...
随机推荐
- linux文件名乱码解决办法
1.linux解压压缩文件乱码 unzip -O CP936 xxx.zip 2.一般文件用convmv sudo convmv -f gbk -t utf-8 -r --notest /your_d ...
- lua学习笔记1
lua中调用c的函数 #include <stdio.h> #include <string.h> #ifdef __cplusplus extern "C" ...
- Red Hat Enterprise Linux Release Dates
Red Hat Enterprise Linux Release Dates UpdatedMay 10 2016 at 10:57 PM - English The tables below lis ...
- gcc编译器对宽字符的识别
最早是使用VC++工具来学习C++,学的越多就越对VC挡住的我看不见的东西好奇,总想多接触一些开发环境,今日抽空摸索了一下CodeBlocks这个开源的IDE使用方法,配置的编译器是MinGW的gcc ...
- [Leetcode][Python]30: Substring with Concatenation of All Words
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...
- LA 5966 Blade and Sword (双向bfs + 想法) - from lanshui_Yang
题目大意:给你一张有n * m个网格的图,每个网格可能是如下符号: “#”:墙 “P”:出发点 “D”:终点 “.”:空地 “*”:传送机 有一个旅行家(假设名叫Mike),他要从点P到达点D,途中必 ...
- linux内核源码阅读之facebook硬盘加速flashcache之五
正常流程到flashcache_map的1623行或1625行,按顺序先看读流程: 1221static void 1222flashcache_read(struct cache_c *dmc, s ...
- Crisis of HDU(母函数)
Crisis of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Request.ServerVariables完整参考
Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提 ...
- js中的数组和字符串的一些方法
数组的一些方法: 1.join()和split()方法 <script type="text/javascript">var x;var a=new Array();a ...