【HDU4741】空间解析几何

2023-11-12

1.题目链接。题目大意:给出两条空间中不平行的直线,求出这两条直线的距离和对应的点。

2.分析:在空间中我们知道,直线有三种关系:相交,平行,异面。但是题目中已经说了,是不相交的直线,所以只可能有两种关系,平行或者异面。在空间中,直线方程并不是很好用(行吧,或者说我不会用)。虽然说这是一个计算几何模板题,但是还是希望可以明白其中道理。

3.我们从向量的角度来考虑这个问题那么我们就不用考虑很多的位置关系。首先是求距离,求距离很简单了,我们可以利用叉积求出这两个向量的公共法向量,然后再在这两条直线上各取一点,求这两点之间的距离在法向量上的投影即可。交点该怎么求呢?我们可以通过求线与面的交点求得。根据法向量,我们可以确定每条直线各自所在的一个平面,并且这个平面是包含法向量的,这样的平面根据几何公理,有且仅有一个。(其实也就是空间解析几何中常用的:两点和垂直于这两点连线的直线可以共同确定一个平面)其实最短距离对应的两个点,就是法向量和这两个平面的交点。至于如何求平面和直线的交点,其实好求,就是求这个直线在法向量方向的偏移。

#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;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【HDU4741】空间解析几何 的相关文章

  • 计算几何 (POJ1127 、 )

    计算几何 1 判断线段是否相交 1 判断线段是否相交 在不需求出交点 xff0c 只需判断两条线段是否相交 xff0c 可以使用 1 快 速 排 斥 实
  • 一,凸包---3,极边

    极边就是组成凸包的边的集合 时间复杂度是o n3 比判断极点快 时间复杂度O n4 快 为什么呢 试想 不论极边也好 极点也好 判断的依据是三角形的方向 无论是海伦公式 还是向量叉乘 极边是需要三个点组成一个三角形 是一个三重循环 即可用t
  • vtk vs2015 win10 64bit 编译注意事项

    记录几个凌乱的关键点 事先安装Qt 我得是5 8版本 需要官网注册之类的 1 关于Python 编译带tcl java python的 vtk 需要很多繁琐的步骤 记录整个过程太恐怖了 vtk暂时不支持python3 支持的还是python
  • 关于使用2d照片进行3d建模

    转载感言 作者一句业余 搞得弟兄们面红耳赤了 感谢作者的可行性分析 Autodesk 的 123D Catch 让我们能够很简单的根据一组照片构建3D物体 你只需要从各个角度拍摄希望建模的物体 然后通过 123D Catch 将照片上传到
  • hihoCoder 1582 Territorial Dispute

    Problem hihocoder com problemset problem 1582 vjudge net problem HihoCoder 1582 Reference hihocoder 1582 Territorial Dis
  • 能通过一张照片(2D)得到3D的模型吗?

    如下内容已经整理成 PDF 很好奇其实如果将人眼所看到的画面保存下来 拍照 人类是可以感知照片内的各个物体 是不是可以理解成这是一种2D到3D认知的转换 作者 知乎用户 链接 https www zhihu com question 529
  • Points Within

    http acm zju edu cn onlinejudge showProblem do problemId 81 Statement of the Problem Several drawing applications allow
  • codeforces 851 #432 div2 C Five Dimensional Points

    Problem codeforces com contest 851 problem C Preference Codeforces Round 432 editorial Codeforces Round 432 Div 2 C Five
  • 3D扫描技术概览

    3D扫描技术概览 复制链接 楼主 eseedo 发表于 2016 11 22 17 14 26 408 0 只看该作者 内容概要 1 使
  • 计算几何02_三次样条曲线

    一 样条 样条 Spline 函数是由舍恩伯格于1946年提出的 样条是富有弹性的细木条或有机玻璃条 它的作用相当于 万能 曲线板 早期船舶 汽车 飞机放样时用铅压铁压住样条 使其通过一系列型值点 调整压铁达到设计要求后绘制其曲线 称为样条
  • CGAL计算几何算法库安装和使用(一)

    CGAL是使用C 开发的计算几何算法库 提供Delaunay三角网 网格生成 多边形 以及各种几何处理算法 应用领域 计算机图形学 科学可视化 计算机辅助设计与建模 地理信息系统 分子生物学 医学影像学 机器人学和运动规划 和数值方法 1
  • Kattis Doors

    Problem open kattis com problems doors vjudge net contest 183886 problem B Reference 点到线段的最短距离算法 Meaning 有两个球 Alex 和 Bob
  • 我的第一个半平面交(1007: [HNOI2008]水平可见直线)

    点击打开链接 Description Input 第一行为N 0 lt N lt 50000 接下来的N行输入Ai Bi Output 从小到大输出可见直线的编号 两两中间用空格隔开 Sample Input 3 1 0 1 0 0 0 S
  • 【HDU4741】空间解析几何

    1 题目链接 题目大意 给出两条空间中不平行的直线 求出这两条直线的距离和对应的点 2 分析 在空间中我们知道 直线有三种关系 相交 平行 异面 但是题目中已经说了 是不相交的直线 所以只可能有两种关系 平行或者异面 在空间中 直线方程并不
  • 【SSL_1232】雷达覆盖

    思路 以一个点作为平角 计算几何统计 c o d e code code include
  • hdu 1255 覆盖的面积

    Problem acm hdu edu cn showproblem php pid 1255 Reference hdu 1255 覆盖的面积 矩形面积并 矩形面积交 矩形周长并 线段树 扫描线总结 Meaning 给出 n 个矩形 求它
  • The centre of polygon (多边形重心)

    描述 Given a polygon your task is to find the centre of gravity for the given polygon 输入 The input consists of T test case
  • 豪斯多夫距离-- Hausdorff distance of convex polygons

    蒙特利尔的麦吉尔大学的计算几何课程资料 原文链接 http cgm cs mcgill ca godfried teaching cg projects 98 normand main html 1 Introduction When ta
  • 火星探险 (Mars)

    暂无链接 题目描述 在2051年 若干火星探险队探索了这颗红色行星的不同区域并且制作了这些区域的地图 现在 Baltic空间机构有一个雄心勃勃的计划 他们想制作一张整个行星的地图 为了考虑必要的工作 他们需要知道地图上已经存在的全部区域的大
  • 判断一个点是否在圆内(三点确定一个圆)

    三角形的外接圆圆心是任意两边的垂直平分线的交点 三角形外接圆圆心叫外心

随机推荐

  • 三款程序员必备神器,爆炸!

    精致 简洁 极客范 想必是每个程序员的终生追求 从此篇文章中您将得到三款免费神器 良心到爆炸 第一 二款 哎 为啥是第一 二款呢 因为这两款神器配合使用的话效果增益 Android WIFI ADB Vysor 最近经常听同学们 即将毕业的
  • deep feature flow

    因为如果将图片识别的网络直接引入视频中的帧 就会发现计算量就会很大 作者提出的这个网络利用的是 1 fowl estimetion feature propagation 比一般的卷积计算速度快很多 2 在空间上找一个关键帧做图像识别 然后
  • 基于协同过滤算法和深度学习的音乐推荐

    基于协同过滤算法和深度学习的音乐推荐 协同过滤 音乐推荐 深度学习 音乐检索 文章目录 基于协同过滤算法和深度学习的音乐推荐 Github 地址 微信小程序版实现 介绍 参考项目 技术栈 Docker 部署 如用此方式部署 后面的手动安装步
  • SpringBoot中整合fastjson,自定义jackson、gson

    如今炒的火热的前后端分离项目 大多数开发人员选择RESTful设计风格 Java Web 人员经常要设计 RESTful API 这种设计通常使用 json 数据进行交互 那么前端传入的 json 数据如何序列化成 Java 对象 后端返回
  • Shell编程规范

    目录 1 Shell脚本概述 1 1shell的作用 1 2Shell脚本应用场景 1 3Shell脚本概念及构成 1 4脚本执行逻辑及执行方式 1 4 1指定路径去执行文件 需要有执行权限 1 4 2指定解释器去执行 不需要权限 1 4
  • PHP实现阿里云金融级实人认证人脸识别h5案例源码,带签名

    PHP部分 本代码段为项目中的代码 部分参数接收方式和路径请自行更改
  • linux hook

    http www codeproject com Articles 33340 Code Injection into Running Linux Application
  • 软件测试面试,一定要准备的7个高频面试题

    问题1 请自我介绍下 核心要素 个人技能优势 工作背景 经验亮点 参考回答 第一种 基本信息 离职理由 面试官您好 我叫张三 来自番茄市 在软件测试行业有 3 年的工作经验 做过 Web APP及小程序项目的测试工作 有独立负责整个项目的测
  • java -jar运行程序,但是断开服务器连接,就会关闭问题

    1 nohup java jar XXX jar gt log out 解析 把此进程作为后台进程运行 且把日志输出到log out文件中 2 指定jdk 进行项目启动 JAVA HOME bin java Xms 256m Xmx 102
  • vue面试题

    1 vue子组件调用父组件方法 方法1 直接在子组件中通过this parent event来调用父组件的方法 方法2 在子组件里用 emit向父组件触发一个事件 父组件监听这个事件就可以了 方法3 在父组件把方法传入子组件中 在子组件里直
  • JAVA开发运维(关于渗透测试与漏洞修复)

    对于C端的网站 H5 小程序或者app都需要进行渗透测试 渗透测试是模拟真实黑客的攻击手段 对目标网站或主机进行全面的安全评估 与黑客攻击不同 渗透测试的目的是尽可能多地发现安全漏洞 而真正的黑客只需要找到一种入侵 点击进入目标系统 一个好
  • Ubuntu18+ 使用redshift调色温 夜间闪烁

    问题描述 在Ubuntu 18 的系统上 使用redshift色温调节软件时 每到晚上 在切换软件时 还有其他奇怪的场景中 屏幕会有频闪现象 症状看来就像redshift反复开启和关闭 原因与解决方案 原因很可能是Ubuntu 18 的系统
  • chrome浏览器fitler中的XHR作用是什么

    chrome浏览器fitler中的XHR作用是什么 记录ajax中的请求 什么是 AJAX AJAX 异步 JavaScript 和 XML AJAX 是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换 AJAX 可以使网
  • SpringBoot集成LayuiAdmin的简单使用

    SpringBoot LayuiAdmin的简单使用 分享一下SpringBoot集成LayuiAdmin的一些心得体会 刚开始网上找了半天没找到集成教程 鼓捣了一阵只好自己上手了 快速开始 1 准备一份LayuiAdmin 源码压缩包解压
  • js——修改对象里面的属性名

    代码 var e avatar uploads 20230816 b30044ba6735c83bdea9d43b85c4ae15 jpeg mobile code 111 nickname 小土豆 e aaa e avatar delet
  • Elasticsearch 跨集群复制(CCR)的使用

    什么是 Elasticsearch 的跨集群复制 CCR Cross Cluster Replication 跨集群复制是 Elasticsearch v6 5 发布的一个新的特性 这个特性可以让你将一个集群的索引数据同步复制到远程的另外一
  • 学习太极创客 — MQTT 第二章(八)ESP8266 MQTT 用户密码认证

    视频链接 https www bilibili com video BV1fK4y1L72n spm id from 333 999 0 0 vd source b91967c499b23106586d7aa35af46413 资料链接 h
  • java上传视频文件到服务器,java视频上传到远程服务器

    java视频上传到远程服务器 内容精选 换一换 该步骤必须在root用户下执行 若以普通系统用户登录 需要执行su切换到root用户下执行后续操作 ssh keygen t rsa过程中需要 可选 输入保存的文件名 默认为在 root ss
  • C#学习笔记 委托

    定义委托 有时候可能想要将一个方法传递给另一个方法 在C 中使用函数指针来实现 在JavaScript中由于函数也是对象所以直接可以在参数列表中传递 而在C 中需要使用委托 要使用委托 首先需要定义它 定义一个接受两个int参数 返回一个i
  • 【HDU4741】空间解析几何

    1 题目链接 题目大意 给出两条空间中不平行的直线 求出这两条直线的距离和对应的点 2 分析 在空间中我们知道 直线有三种关系 相交 平行 异面 但是题目中已经说了 是不相交的直线 所以只可能有两种关系 平行或者异面 在空间中 直线方程并不