HDU 4741 空间几何求两直线距离最近点

给出两直线经过的两点,没有平行的情况,求两直线最短距离和最短距离的两点。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>

using namespace std;
const double eps = 1e-8;

//三维空间点
struct Point
{
    double x, y, z;
    Point(double x=0,double y=0,double z=0): x(x),y(y),z(z){}
    Point(const Point& a)
    {
        x = a.x;
        y = a.y;
        z = a.z;
        return;
    }
    void Print()
    {
        printf("%lf %lf %lf\n", x, y, z);
    }

    Point operator + (Point &t)
    {
        return Point(x+t.x, y+t.y, z+t.z);
    }
};

//空间直线
struct Line
{
    Point a,b;
};

//空间平面
struct Plane
{
    Point a,b,c;

    Plane(){}
    Plane(Point a, Point b, Point c):a(a),b(b),c(c){}

    void showPlane()
    {
        a.Print();
        b.Print();
        c.Print();
        return;
    }
};

double dcmp(double t)
{
    if(fabs(t) < eps) return 0;
    return t < 0 ? -1 : 1;
}

//三维叉积
Point cross(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 multi(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 dist(Point p1, Point 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 VectorLength(Point p)
{
    return sqrt(p.x*p.x + p.y*p.y + p.z*p.z);
}

//空间直线距离
double LineToLine(Line u,Line v,Point &tmp )
{
    tmp = cross(sub(u.a,u.b),sub(v.a,v.b));
    return fabs(multi(sub(u.a,v.a),tmp))/VectorLength(tmp);
}

//取平面法向量
Point normalVector(Plane s)
{
    return cross(sub(s.a,s.b),sub(s.b,s.c));
}

//空间平面与直线的交点
Point Intersection(Line l,Plane s)
{
    Point ret = normalVector(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;
}

/************以上为模板*************/

void work(Line A, Line B)
{
    Point normal;
    double d = LineToLine( A, B, normal );
    printf("%.6lf\n",d);
    Plane alpha = Plane(A.a, A.b, A.a + normal);
    Plane beta  = Plane(B.a, B.b, B.a + normal);
    Point u = Intersection(B,alpha);
    Point v = Intersection(A,beta);
    printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", v.x, v.y, v.z, u.x, u.y, u.z );
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        Line A,B;
        scanf("%lf%lf%lf", &A.a.x, &A.a.y, &A.a.z);
        scanf("%lf%lf%lf", &A.b.x, &A.b.y, &A.b.z);
        scanf("%lf%lf%lf", &B.a.x, &B.a.y, &B.a.z);
        scanf("%lf%lf%lf", &B.b.x, &B.b.y, &B.b.z);
        work(A,B);
    }
    return 0;
}
时间: 2024-08-22 14:10:36

HDU 4741 空间几何求两直线距离最近点的相关文章

JAVA求两直线交点和三角形内外心的方法_java

一.求两直线交点 复制代码 代码如下: class Point {    double x;    double y;     public Point() {        this.x = 0;        this.y = 0;    }}class Line {    Point a;    Point b;     public Line() {        this.a = new Point();        this.b = new Point();    }    //求

求两直线交点和三角形内外心

一.求两直线交点 class Point { double x; double y; public Point() { this.x = 0; this.y = 0; } } class Line { Point a; Point b; public Line() { this.a = new Point(); this.b = new Point(); } //求两直线的交点,斜率相同的话res=u.a Point intersection(Line u,Line v){ Point res

POJ 1269 求两直线交点

题意:给出4个点,两个一组在两条直线上,求出这两条直线的重合部分,NONE就是平行,LINE就是重合,POINT就是有交点并且输出交点. 解析几何那么求,没什么好说的直接看代码吧. #include <iostream> #include<cstdio> #include<algorithm> using namespace std; typedef double PointType; struct point { PointType x,y; }; point jd;

c语言几何-如何让用c语言求两个曲面的交线,木有思路

问题描述 如何让用c语言求两个曲面的交线,木有思路 就例如两个圆柱相惯但是角度不同,求交线,相惯面的面积,本人不知道如何下手,希望有大神可以指点迷津,给个思路, 解决方案 你要自己研究算法,然后用C语言.或者其他语言来实现,语言只是工具,但是他没有办法帮你来研究算法. 解决方案二: 这个问题.和C语言没有半毛钱关系 解决方案三: 看不懂啊,学过c语言,但都是十几年前的事了.就是来混点C币,下东西. 解决方案四: 你这个是有gui的东西没有,没有的话,肯定是要先研究清楚,几何上是怎么画的啊

c++-运行不成功,这是求点到直线的 距离

问题描述 运行不成功,这是求点到直线的 距离 #include"iostream.h" #include"math.h" class line; class point() { private: double x,y; public: point (double x1,double y1) { x=x1; y=y1; } friend double dist(point,line); }; class line() { private: double a,b,c;

已知两个点的坐标,求它们的距离,请问编程怎么实现?是windows phone

问题描述 已知两个点的坐标,求它们的距离,请问编程怎么实现?是windows phone 已知两个点的坐标,求它们的距离,请问编程怎么实现?是windows phone 解决方案 http://blog.163.com/gobby_1110/blog/static/29281715201271745123282/ 解决方案二: 套用数学求两个点的距离的数学公式有那么难吗 解决方案三: 把两个点想象到坐标轴上,点A和点B 如果X相等,则AB距离是Y相减 如果Y相等,则AB距离是X相减 如果X相等,

用eclipse写一个程序,求两点之间距离

问题描述 packagelianxi;publicclassLine{Pointstartpoint;Pointendpoint;publicvoidPoint(doublex1,doubley1,doublex2,doubley2){startpoint=newPoint(x1,y1);endpoint=newPoint(x2,y2);}publicvoidLine(Pointstartpoint,Pointendpoint){this.startpoint=startpoint;this.e

四面体 空间几何算法问题

问题描述 四面体 空间几何算法问题 给定一个四面体,通过读入四个值(1-10),分别作为其底面,正面,右面,左面所涂的颜色,如果两个四面体在旋转的意义下,四面的颜色可以一一对应,则认其为同一种四面体. 输入: 第一行为一个整数N,代表四面体个数 接下来的每行四个数,分别对应一个四面体四个面的颜色 输出: 不同的四面体个数 解决方案 样例 输入 4 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 输出 2 求各位大神给小弟一个思路....

如何求两个数组的交集

题目意思大概是这样的:给定两个大数组(1w以上1亿以下),用最有效的方法找出来两个数组的交集. 对于这道题,我有一个思路就是,先对数组进行排序,然后用两个指针在已排序的数组上轮流指向头结点,进行比较. 比较亮的地方,就是在于这个比较的方式了. 首先,比较的时候,要先确定两个指针指向的内用是否一致.如果一致,那么这个点,就是交集的一个元素,没问题吧? 这里有一个问题就是,接下来如何比较? 步骤是这样的:先比较两个指针指向内容的大小,指向结果小的指针,开始递增,直到较小的指针指向的值大于或等于另一个