空间直线与球面的相交算法

【CV】3D空间中椭球曲面与直线的交点问题 首先,在 3D 空间XYZXYZ\text{XYZ}坐标系中, 椭球曲面的方程为 (x−Cx)2R2x+(y−Cy)2R2y+(z−Cz)2R2z=1(x−Cx)2Rx2+(y−Cy)2Ry2+(z−Cz)2Rz2=1\frac{(x-C_x)^2}{R_x^2} + \frac{(y-C_y)^2}{R_y^2} + \frac{(z-C_z)^2}{R_z^2} = 1,其中 (Cx,Cy,... 阅读详情

      

目录

1. 原理推导

1.1. 直线公式

1.2. 求交

2、代码实现

2.1 关键代码

2.2 main()函数的调用


1. 原理推导

1.1. 直线公式

       空间直线的数学定义是,已知直线L上一点M0(x0,y0,c0),以及直线L的方向向量s(m,n,p),那么空间直线L的方程为:

以上是空间直线的标准式方程(点向式方程)。令上面式子的比值为t,那么直线的参数式方程为:

对于知道线段的起点O和终点E,显然方向向量为D=E−O。这时,根据射线的向量方程,线段上某一点P为

 转化为参数方程就是:

并且,采取这种公式描述还有个好处,参数t的取值范围为0到1,否则就在直线的两个端点之外。当t取0时,表四起点O;当t取1时,表示终点E;当t取(0,1)范围表示位于O、E端点之间的点。

1.2. 求交

根据数学定义,已知球心坐标C(Cx,Cy,Cz)与球的半径R,球面的公式为:

联立(1)(2)两式,最终会得到一个关于t的一元二次方程:

展开合并同类项,得出关于t的一元二次方程如下:

解这个一元二次方程,该方程有无解,单个解,以及双解三种可能,这也符合空间直线与球面相交的直观认识,要么相切有一个交点,要么相交有两个交点,否则的话没有交点。 

2、代码实现

2.1 关键代码

/* 两个向量的差, (vector1 - vector2). */
vec3d vdiff(const vec3d vector1, const vec3d vector2)
{
    vec3d v;
    v.x = vector1.x - vector2.x;
    v.y = vector1.y - vector2.y;
    v.z = vector1.z - vector2.z;
    return v;
}

/* 两个向量的和, (vector1 + vector2). */
vec3d vsum(const vec3d vector1, const vec3d vector2)
{
    vec3d v;
    v.x = vector1.x + vector2.x;
    v.y = vector1.y + vector2.y;
    v.z = vector1.z + vector2.z;
    return v;
}

/* 向量的数乘1. */
vec3d vmul(const vec3d vector, const double n)
{
    vec3d v;
    v.x = vector.x * n;
    v.y = vector.y * n;
    v.z = vector.z * n;
    return v;
}

/* 向量的数乘2. */
vec3d vdiv(const vec3d vector, const double n)
{
    vec3d v;
    v.x = vector.x / n;
    v.y = vector.y / n;
    v.z = vector.z / n;
    return v;
}

/* 向量的欧几里得范数 */
double vdist(const vec3d v1, const vec3d v2)
{
    double xd = v1.x - v2.x;
    double yd = v1.y - v2.y;
    double zd = v1.z - v2.z;
    return sqrt(xd * xd + yd * yd + zd * zd);
}

/* 向量的欧几里得范数  */
double vnorm(const vec3d vector)
{
    return sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);
}

/* 两个向量的点积*/
double dot(const vec3d vector1, const vec3d vector2)
{
    return vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z;
}

/*两个向量的叉积 */
vec3d cross(const vec3d vector1, const vec3d vector2)
{
    vec3d v;
    v.x = vector1.y * vector2.z - vector1.z * vector2.y;
    v.y = vector1.z * vector2.x - vector1.x * vector2.z;
    v.z = vector1.x * vector2.y - vector1.y * vector2.x;
    return v;
}


/* Intersecting a sphere sc with radius of r, with a line p1-p2.
 * Return zero if successful, negative error otherwise.
 * mu1 & mu2 are constant to find points of intersection.
 * 球和直线的相交
 *
*/
int sphereline(const vec3d p1, const vec3d p2, const vec3d sc, double r, double *const mu1, double *const mu2)
{
   double a,b,c;
   double bb4ac;
   vec3d dp;

   dp.x = p2.x - p1.x;
   dp.y = p2.y - p1.y;
   dp.z = p2.z - p1.z;

   a = dp.x * dp.x + dp.y * dp.y + dp.z * dp.z;

   b = 2 * (dp.x * (p1.x - sc.x) + dp.y * (p1.y - sc.y) + dp.z * (p1.z - sc.z));

   c = sc.x * sc.x + sc.y * sc.y + sc.z * sc.z;
   c += p1.x * p1.x + p1.y * p1.y + p1.z * p1.z;
   c -= 2 * (sc.x * p1.x + sc.y * p1.y + sc.z * p1.z);
   c -= r * r;

   bb4ac = b * b - 4 * a * c;

   if (fabs(a) == 0 || bb4ac < 0) {
      *mu1 = 0;
      *mu2 = 0;
      return -1;
   }

   *mu1 = (-b + sqrt(bb4ac)) / (2 * a);
   *mu2 = (-b - sqrt(bb4ac)) / (2 * a);

   return 0;
}



sphereline函数代码解释:

1) p1相当于前文说的O点;p2相当于E点;dp相当于OE线段。

2) 根据1)我们知道p1.x = Ox(此时t = 0); p2.x = Ox + Dx(此时t = 1);则dp.x = p2.x - p1.x =  Ox + Dx - Ox = Dx;同理:dp.y = Dy;dp.z = Dz,所以 a相当于前文公式(3)中t平方的系数。

3) b相当于公式(3)中t的系数。

4) c相当于公式(3)中的常数项。

5)之后就用一元二次方程的求根公式求线段dp和球的交点。解这个一元二次方程,该方程有无解,单个解,以及双解三种可能,这也符合空间直线与球面相交的直观认识,要么相切有一个交点,要么相交有两个交点,否则的话没有交点

2.2 main()函数的调用

  int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    vec3d O;
    O.x = 30;
    O.y = 40;
    O.z = 70;

    vec3d E;
    E.x = 30;
    E.y = -40;
    E.z = 70;

    vec3d Center;
    Center.x = 0;
    Center.y = 0;
    Center.z = 70;


    double R = 50;
    double res1,res2;

    int  result = 1;
    result = sphereline(O,E,Center,R,&res1,&res2);

    qDebug()<<"求解得到的参数t为:";
    qDebug()<<"t1:"<< QString::number(res1,'g',5);
    qDebug()<<"t2:" <<QString::number(res2,'g',5);

    vec3d ex,t2,t3;
    double h;

    ex = vdiff(E, O); // vector result1-result2
    h = vnorm(ex); // scalar result1-result2
    ex = vdiv(ex, h); // unit vector ex with respect to result1 (new coordinate system)
    /* t2 points to the intersection */
    t2 = vmul(ex, res1*h);
    t2 = vsum(O, t2);

    t3 = vmul(ex, res2*h);
    t3 = vsum(O, t3);

    qDebug()<<"求解得到如下的交点:";
    qDebug()<< QString::number(t2.x,'g',5);
    qDebug()<< QString::number(t2.y,'g',5);
    qDebug()<< QString::number(t2.z,'g',5)<<endl;

    qDebug()<< QString::number(t3.x,'g',5);
    qDebug()<< QString::number(t3.y,'g',5);
    qDebug()<< QString::number(t3.z,'g',5)<<endl;


    return a.exec();
}

调试输出:

本文转自:空间直线与球面的相交算法_intersecting a sphere sc with radius of r, with a -优快云博客 

     

非欧空间机器学习:从双曲嵌入到球面CNN的工业实践 机器学习中的数据空间假设正经历根本性变革——当数据天然具有层级、方向或曲率特征时,传统欧氏空间建模会引发距离失真、度量失效与泛化瓶颈。非欧空间学习通过双曲空间(适配树状结构)、球面空间(处理方向性数据)和黎曼流形(建模各向异性分布)重构数据几何本质,提升测地线距离精度、层次保真度与任务鲁棒性。其技术价值体现在社交网络嵌入误差降低54%、气象预测Haversine误差下降35%、医疗影像分割mAP提升11.3%等工业结果中。本文聚焦算法工程师与跨领域研究者,提供可落地的流形诊断、Poincaré嵌入、S²-C 阅读详情

相关推荐

MATLAB高效实现圆与线簇相交检测:原理、向量化与工程实践

几何计算是计算机图形学、机器人学和GIS等领域的核心基础,其中相交检测是判断几何对象空间关系的关键操作。其基本原理通常涉及将几何问题转化为数学模型,例如通过参数方程和二次方程求解交点。在工程实践中,算法的数值稳定性和计算效率至关重要,这直接影响到路径规划、碰撞检测和地理空间分析等应用场景的性能。本文聚焦于圆与线段簇的相交问题,深入探讨了从直线求交到线段判定的完整数学模型,并针对MATLAB平台的特点,详细阐述了如何利用向量化计算提升大规模线簇处理的效率。通过引入容差处理数值精度问题,以及提供可视化验证和常见

473

空间直线与球面相交算法

详细介绍了空间直线与球面相交的C/C++实现。

Charlee44的技术驿站 7011

非欧空间机器学习:图数据与层级结构的几何建模实战

非欧空间机器学习是面向图数据、知识图谱、社交网络等天然具有层级性与拓扑结构的数据所发展的新一代建模范式。其核心原理在于放弃欧氏空间中线性叠加、内积与对称距离的强假设,转而采用双曲空间、球面空间或黎曼流形等能忠实刻画数据本征几何的数学结构。技术价值体现在对层级关系的指数级压缩表达(如词义树、品类体系)、对旋转/周期性约束的自然建模(如3D姿态),以及对异质曲率场景的局部自适应(如交通路网)。典型应用场景包括推荐系统长尾优化、蛋白质折叠预测、金融反欺诈图分析及AR手势识别。本文聚焦工业级落地中的Poincaré

weixin_33207473的博客 345

MATLAB-空间曲面与直线求解交点坐标

求解空间曲面与直线的交点坐标,以及相关的拓展,如绘图、限制变量范围、引用其他函数。

chen_studying的博客 1955

39、球面几何算法:弧长计算与地球距离近似

本文介绍了球面几何中弧长计算的相关知识,包括直角坐标系和球坐标系的转换、球面上弧长的计算方法,并结合实际应用讲解了如何近似计算地球上两点之间的距离。同时,对轨迹与限制区域相交、点的方向判断、线段相交的特殊情况、凸包的凸性问题等进行了详细解答。这些内容在地理信息系统、导航等领域有广泛应用。

info6的博客 173

44、计算几何中的点定位、相交检测与装箱问题

本文介绍了计算几何中的三个核心问题:点定位、相交检测与装箱问题。点定位关注如何确定查询点所在的区域,涉及射线法、三角化和kd-树等方法;相交检测处理线段或多边形之间的交集判断,采用平面扫描算法以提高效率;装箱问题作为NP完全问题,通常使用首次适应递减法等启发式策略来优化空间利用。文章结合实际应用场景,分析了各类问题的影响因素与解决方案,并总结了相关算法的实现工具与数据结构选择。

peace的博客 57

Mtalab 空间直线和球形的交点以及图像绘制

Mtalab 空间直线和球形的交点以及图像绘制前言一、问题描述二、交点求解三、图像绘制四、求解结果源码 前言 本文包括利用Matlab对三维空间中的球形和直线交点进行求解、球形的绘制。 一、问题描述 求三维空间中,球和直线的交点。球的中心坐标为(10,10,10),半径为:1.6。直线过点 (9.12572004 ,7.565155035,8.6508179)、(10,10,10) 这里,我将球的中心坐标重新定义为坐标原点(0,0,0),则问题转化为:球的中心坐标为(0,0,0),半径为:1.6。直线过点(

ONERYJHHH的博客 5315

69、计算几何中的点定位、相交检测与装箱问题

本文深入探讨了计算几何中的三个核心问题:点定位、相交检测与装箱问题。点定位关注查询点所在区域的快速判定,涵盖射线法、平板法及基于三角剖分的方法,并讨论了多维场景下的kd-tree和行走策略;相交检测分析线段或多边形之间的交集判断,重点介绍平面扫描线算法及其在虚拟现实、CAD中的应用;装箱问题研究如何用最少箱子容纳所有物品,详述首次适应递减等启发式算法及实际约束处理。文章还总结了各问题的关键算法复杂度、影响因素、实现工具与典型应用场景,为相关领域的算法选择与优化提供指导。

lg888的博客 68

2018-2019 ACM-ICPC, Asia East Continent Finals F. Interstellar … Fantasy(几何)

F. Interstellar … Fantasy time limit per test 1.0 s memory limit per test 256 MB input standard input output standard output Unfortunately, the boy finally got bankrupt. Looking at his recedi...

咸鱼有梦想 1564

生成三维球面上随机坐标的实用方法

球面坐标系统是一种用于描述三维空间中点的位置的方法,它将空间中的点表示为与原点的距离以及在球面上的角度。该系统广泛应用于物理学、天文学、导航等领域,尤其在处理球形或接近球形的物体时更为有效。球面坐标系统通常使用三个参数:径向距离(r),方位角(θ),和极角(φ),这三个参数与笛卡尔坐标系统中的x、y、z轴有着明确的数学关系。在本章中,我们将首先介绍球面坐标系统的基本定义和特性,然后探讨其在实际应用中的重要性和适用场景。

weixin_31620365的博客 1114

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 323

直线与球体的交点lisp,线条与球体之间的交点

I'm trying to find the point of intersection between a sphere and a line but honestly, I don't have any idea of how to do so.Could anyone help me on this one ?解决方案Express the line as an function of t:...

weixin_39608526的博客 172

国产AI芯片实战:用寒武纪MLU370低成本部署DeepSeek-R1,实测推理效果与成本分析

本文详细介绍了寒武纪MLU370芯片在部署DeepSeek-R1大模型时的实战效果与成本优势。通过实测数据对比,MLU370在推理速度、能效比和本地化服务方面表现突出,尤其适合智能客服、内容生成等场景,可显著降低硬件投入和运维成本。

weixin_30613727的博客 457

计算空间中实心圆与平面相交线段

讨论圆面与无限平面的相交状态

qq_55433334的博客 1241

C#:WPF格式转Winform格式

WPF格式转Winform格式

Hello C++ 1295

游戏大厂状态同步与帧同步技术全解析——让虚拟世界万物协同的“时间齿轮”

本文深入解析了大厂游戏开发中的两种核心同步技术:状态同步和帧同步。状态同步适合大型MMO和FPS游戏,由服务端计算并广播世界状态;帧同步则通过统一操作输入实现MOBA和RTS游戏的绝对公平。文章详细比较了两者的差异、适用场景和底层实现原理,并揭秘了《王者荣耀》《PUBG》等热门游戏的同步机制。同时探讨了本地预测、延迟补偿、防作弊等关键技术,以及未来AI和云游戏带来的同步新挑战,为开发者提供了全面的技术参考和实践指南。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 920

三维计算几何模板

三维计算几何

LJ__ 551

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

检测空间中实心圆与平面是否相交

求解空间中一扇圆形,与平面是否相交

qq_55433334的博客 539

2.1 amdgpu BO的类型和用途

AMDGPU驱动中,amdgpu_bo_create_user和amdgpu_bo_create_kernel分别用于创建用户空间和内核空间的buffer对象(BO)。用户空间BO支持元数据、tiling flags等属性,由GEM handle管理生命周期;内核BO则用于驱动内部资源如ringbuffer,自动pin并可选CPU映射。二者在返回类型、生命周期管理和使用场景上存在根本差异,前者面向图形渲染/AI等应用,后者服务于驱动内部任务。

图形/计算GPU的驱动与虚拟化技术分享园地 2210

orange软件:入门使用

orange做数据分析契机实验手册目录orange软件部分界面展示小试牛刀:数据导入和展示小试牛刀:散点图绘制总结 契机 今天在上大数据时代实验课,作为一名软件工程专业的大三学生,在上这节公选课之前就决定这节课做完这个学期所有的实验报告,可以说“有亿点”不屑;尤其当老师说Python很麻烦的时候,我更是震惊了,因为我接触过这么多编程语言,Python真的很友好了,很傻瓜,但是当老师打开实验手册的时候,我真香了!!!下面先来看看手册的目录: 实验手册目录 为什么会真香呢,因为目录里这些有好多机器学习算法!

weixin_45880844的博客 1万+

c++中射线表示_射线与球的相交测试

chopper:目录​zhuanlan.zhihu.com本节将描述两种射线与球体的相交测试方法,方法一是采用参数方程求解的方法,可以计算出直线、射线、线段与球的交点,方法二在Akenine-Möller等[1]中有描述,只涉及射线与球的相交测试,采用几何关系来优化测试。此外,对二维空间下,射线与圆的相交测试,也可以采用本节介绍的两种方法,由于维度更小,所以更加简单,这里就不再赘述,最后提供描述算...

weixin_33037051的博客 941

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

空间切割问题

把上面所有等式的「左边相加」和「右边相加」,得到:g(1)+g(2)+g(3)+...+g(k−1)​=[g(0)+1]+[g(1)+2]+[g(2)+3]+...+[g(k−2)+(k−1)]​。递推公式:g(k) = g(k-1) + k(初始条件:g(0)=1,0 条直线时平面是 1 个区域)。递推公式:p(k) = p(k-1) + 4(k-1) + 1(初始条件:p(0)=1,p(1)=2)通项公式:p(k) = 2k² - k + 1。时:g(k−1)=g(k−2)+(k−1)

mzpppp的博客 431

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

不仅是平移:3D曲面偏置的核心挑战 自相交、奇异点与边界条件解析

问题核心原因带来的挑战解决方案自相交曲面存在凹区域产生无效的、自我穿透的几何体,破坏拓扑检测相交并裁剪多余部分奇异点曲面存在尖​角/边或退化点法向量未定义,标准算法失效特殊情况处理,用圆角/补片替换边界条件曲面是有限的,有边缘偏置后产生开放空隙,无法形成实体根据用户设置构建侧壁并缝合。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1534

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 将QComboBox下拉项中的文本居中、居右
下一篇: 射线和三角形的相交检测(ray triangle intersection test)
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值