• hdu4741


    题意:给定两条异面直线,求公垂线交点及垂足。

    思路:去年网络赛杭州站的题,实际上就是一个模板。。顺带用来整理补充一下计算几何模板库。

    code:

      1 /*
      2  * Author:  Yzcstc
      3  * Created Time:  2014/10/2 21:52:38
      4  * File Name: hdu4741.cpp
      5  */
      6 #include<cstdio>
      7 #include<iostream>
      8 #include<cstring>
      9 #include<cstdlib>
     10 #include<cmath>
     11 #include<algorithm>
     12 #include<string>
     13 #include<map>
     14 #include<set>
     15 #include<vector>
     16 #include<queue>
     17 #include<stack>
     18 #include<ctime>
     19 #define repf(i, a, b) for (int i = (a); i <= (b); ++i)
     20 #define repd(i, a, b) for (int i = (a); i >= (b); --i)
     21 #define M0(x)  memset(x, 0, sizeof(x))
     22 #define Inf  0x7fffffff
     23 #define MP make_pair
     24 #define PB push_back
     25 #define eps 1e-8
     26 #define pi acos(-1.0)
     27 using namespace std;
     28 inline int sgn(const double& x){
     29     return (x > eps) - (x < -eps);
     30 }
     31 struct point{
     32      double x, y, z;
     33      point(double _x = 0, double _y = 0, double _z = 0):x(_x), y(_y), z(_z){}
     34      void input(){
     35         scanf("%lf%lf%lf", &x, &y, &z);
     36      }
     37      double len()const{
     38          return sqrt(x * x + y * y + z * z);
     39      }
     40      point trunc(const double &l) const{
     41            double r  = l / len();
     42            return point(x * r, y * r, z * r); 
     43      }
     44      bool operator!=(const point& p1)const{
     45          return !(sgn(x - p1.x) == 0 && sgn(y - p1.y) == 0 && sgn(z - p1.z) == 0);
     46      }
     47      point operator-(const point& p1)const{
     48          return point(x - p1.x, y - p1.y, z - p1.z);
     49      }
     50      point operator+(const point& p) const{
     51          return point(x + p.x, y + p.y, z + p.z);      
     52      }
     53      double operator^(const point& p1)const{
     54          return x * p1.x + y * p1.y + z * p1.z;
     55      }
     56      point operator*(const point& p1)const{
     57          return point(y * p1.z - z * p1.y, z * p1.x - x * p1.z, x * p1.y - y * p1.x);
     58      }
     59      point operator*(const double& l)const{
     60          return point(x * l, y * l, z * l);      
     61      }
     62 } p[101];
     63 
     64 
     65 int parallel(const point& u1,const point& u2,const point& v1,const point& v2){
     66     return sgn(((u1 - u2) * (v1 - v2)).len()) == 0;
     67 }
     68 
     69 double line2line_dist(const point& u1, const point& u2,const point& v1,const point& v2){ //计算直线u与v距离
     70     point n =  (u1 - u2) * (v1 - v2);
     71     return fabs((u1-v1) ^ n) / n.len();
     72 }
     73 
     74 point intersection(const point& u1,const point& u2, const point& v1,const point& v2){
     75     double t=((u1.x-v1.x)*(v1.y-v2.y) - (u1.y-v1.y)*(v1.x-v2.x)) 
     76               /((u1.x-u2.x)*(v1.y-v2.y) - (u1.y-u2.y)*(v1.x-v2.x));
     77     point p = u1 + (u2 - u1) * t;
     78     return p;
     79 }
     80 
     81 void solve(){
     82      for (int i = 0; i < 4; ++i)
     83            p[i].input();
     84      point v = (p[0] - p[1]) * (p[2] - p[3]);
     85      double dist = line2line_dist(p[0], p[1], p[2], p[3]);
     86      point v2 = p[2] - p[0];
     87      if (sgn(v ^ v2) < 0) v = v * -1;
     88      v = v.trunc(dist);
     89      point p2 = intersection(v + p[0], v + p[1], p[2], p[3]);
     90      point p1 = p2 - v;
     91      printf("%.6f
    ", dist);
     92      printf("%.6f %.6f %.6f %.6f %.6f %.6f
    ", p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
     93      
     94 }
     95 
     96 int main(){
     97  //   freopen("a.in", "r", stdin);
     98  //   freopen("a.out", "w", stdout);
     99     int cas;
    100     scanf("%d", &cas);
    101     while (cas--){
    102          solve();
    103     }
    104     return 0;
    105 }
    View Code
  • 相关阅读:
    jquerymobile 的特有 事件 和 方法 (转)
    JQueryMobile开发必须的知道的知识(转)
    Google地图之OverlayView使用(自定义叠加层)
    [TPYBoard
    [TPYBoard
    [TPYBoard
    【micropython】用python来进行BadUSB的USB-HID测试(含无线控制)
    利用51单片机制作廉价盒仔机器人
    linux 的内核的作用和功能
    计算机操作系统中的硬件资源和软件资源都包括哪些
  • 原文地址:https://www.cnblogs.com/yzcstc/p/4005311.html
Copyright © 2020-2023  润新知