判断两个圆柱体是否相交
问题
看到有人问这个问题。然后我写了解决这个问题的一个有用的理论准备。接下来简单介绍如何使用它判断两个圆柱是否相交。
解法
问题中的圆柱假设有中轴线,lil_i, 用固定点 Xi=(ai,bi,ci)TX_i=(a_i,b_i,c_i)^T 和方向 Wi=(wi1,wi2,wi3)TW_i=(w_1^i,w_2^i,w_3^i)^T 表达。投影矩阵 TiT_i 和 P∗P^*的求法都参考 这里的理论准备。
假设大圆柱半径 RR, 小圆柱半径 rr。
如此判断两个圆柱是否相交:
1. 如果两个圆柱的轴线平行,只须判断轴线距离和半径之和的关系,以及圆柱在轴线方向上的区间重叠情况(成为容易判断的一维相交问题);
2. 对于其它情况,先求两个轴线公垂线的中点P∗P^*,求它到大小两个圆柱轴线的距离 d=d1=d2d=d_1=d_2:
3.
如果 P∗P^* 到大圆柱轴线的距离d>Rd>R (或 2d>R+r2d\gt R+r), 显然两圆柱不相交;
如果2d≤R+r2d\le R+r, 而且 P∗P^*在大小两圆柱各自的两个有向底面之间(通过两个底所在有向平面确定),两圆柱相交;
如果 P∗P^* 到大圆柱的轴线距离d≤Rd\le R 且 (2d≤R+r2d\le R+r), 但是不在大小两个圆柱任意一个圆柱所在轴线方向上的区间之内,需要求
圆周面上经过公垂线和圆周面交点的母线在圆柱底面之间的部分与另一 圆周轴线距离并跟半径比较大小,或者采用如下
带约束的最小化方法
当且仅当 P∗P^* 点不在四个圆柱底面之间时才考虑如下约束优化问题。考虑圆柱有两个底面, 所以,不妨弄成带约束的最优化问题。
求点 P(x,y,z)P(x,y,z), 满足四个圆柱底面的线性不等式约束,同时,总有这样的点到两条直线的距离平方和最小.
求出来的点 P(x,y,z)P(x,y,z) 如果到两个轴距离之和 d1+d2≤R+rd_1+d_2\le R+r 则圆柱相交. 其它情况不相交.
补充
问题比想象中难些。如果是二次规划问题,还不见得凸,也就难免NP-hard; 所以,想单纯用一个带线性约束的最小二乘问题解恐怕不一定行;如果分情况讨论问题可以简化。可以解,但是比较繁琐。
好吧,放弃,把问题交给现成的解决方案。
文档和说明
其它引申的凸的几何体相交的问题
1。先判断距离,约束最小二乘问题;如果最小值大于 R2+r2R^2+r^2不相交,否则考虑下一步:
2。再考虑投影,投影到平行于两个轴的平面上,——几何变换问题——检查两个矩形是不是有公共点?同时,沿其中一个圆柱的轴向投影,看投影得到的圆跟椭圆封端的矩形是不是有公共点。任何一个条件不满足,都不相交。从画法几何的角度,如果两个圆柱轴线方向不平行,那么,两个圆柱相交的充要条件是: 分别沿着两个圆柱的轴线方向投影,得到两幅包含至少各有一个圆和一个一对对边平行、另一对对边为椭圆弧的形状的投影,两个平面区域都是连通的
判断两个圆柱体是否相交相关推荐
- 编程之美:编程判断两个链表是否相交
1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...
- 3.6 判断两个链表是否相交
判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...
- 判断两个链表是否相交
方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...
- ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...
- 如何判断两条直线是否相交
之前写过一篇如何判断两条线段是否相交,我们紧接这个主题,再来谈谈如何判断两条直线是否相交 如何判断两条直线是否相交 总体来上,判断直线是否相交比判断线段是否相交容易多了 两条直线相交只有两种情况 第一 ...
- 判断两条线段是否相交 java_判断两个线段是否相交02
写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...
- 判断两个多边形是否相交相交
// 1 判断相交//判断两多边形线段是否相交function isSegmentsIntersectant(segA, segB) {//线线const abc = (segA[0][0] - se ...
- 判断两条直线是否相交c语言,计算几何-两条线段是否相交(三种算法)
原标题:计算几何-两条线段是否相交(三种算法) 计算几何中,判断线段是否相交是最基本的题目. 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条 ...
- 判断两个形状是否相交(二)-GJK
判断两个形状是否相交二-GJK 原文地址 一 介绍 二凸多边形性质 三Minkowski和 四单纯形 五支持函数 六创建单纯形 七相交检测 八迭代 然后我们开始循环迭代 第二次迭代 第三次迭代 九检测 ...
最新文章
- CSS鼠标响应事件经过、移动、点击示例介绍
- jvm调优:能生成的线程数
- Leetcode-2 两数相加【c语言】
- C++基于TCP和UDP的socket通信
- u盘弹出工具_双佳数码 | 电脑u盘无法弹出怎么办?
- 12月10日见!卢伟冰:红米K30将用上液冷散热
- 05-BIO,NIO,AIO几种通讯模式的比较
- ASP.NET或者 js方式实现文件夹多图片浏览的方式
- Ubunu16.04安装CPU版本Tensorflow
- Vue 导出excel 导出多个sheet
- VBS教程(入门级)
- 从autotool迁移到cmake
- 从小白到架构师原来是这样修炼出来的
- CSS3实现5个常用的网页动画效果
- 闲鱼双11端侧实践总结
- Loongson_2F/ 3A【tftp+u盘】方式安装系统(开机不认u盘)
- LARS(最小角回归)
- 移动宽带套餐介绍_中国移动宽带套餐有哪些,谢谢!
- Android:展锐battery
- javaweb基础搭建及导入包报错Cannot resolve org.codehaus.plexus:plexus-utils:3.0.5