当前位置: 首页 > news >正文

平面与平面相交算法杂谈

1.前言

空间平面方程:

空间两平面如果不平行,那么一定相交于一条空间直线,

空间平面求交有多种方法,本文进行相关讨论。

2.讨论 

可以联立方程组求解,共有3个变量,2个方程,而所求直线有1个变量,直线方程为,

2.1.方法一:联立方程求解

通过如下链接中方法可得到所交直线方程,

analytic geometry - How to calculate the intersection of two planes? - Mathematics Stack Exchangehttps://math.stackexchange.com/questions/475953/how-to-calculate-the-intersection-of-two-planes Planes intersection calculatorhttp://www.ambrnet.com/TrigoCalc/Plan3D/Plane3D_.htm

化为直线参数方程:

 这种方法有其局限性,上述公式的分母可能为0,就需要比较繁杂的处理,如令x=t,重新求解。斯坦福官网中的关于Plane类实现的资料中对于面面相交(plane intersect plane)也没有实现该情况的处理,

bool Plane::PlanePlaneIntersection(const Plane &P1, const Plane &P2, Line3D &L)
{
    float Denominator = P1.a * P2.b - P1.b * P2.a;
    if(Denominator == 0.0f)
    {
        // this case should be handled by switching axes...
        return false;
    }
    L.P0 = Vec3f((P2.d * P1.b - P1.d * P2.b) / Denominator, (P1.d * P2.a - P2.d * P1.a) / Denominator, 0.0f);

    L.D = Vec3f::Cross(P1.Normal(), P2.Normal());
    if(L.D.Length() == 0.0f)
    {
        return false;
    }
    L.D = Vec3f::Normalize(L.D);

    return true;
}

Plane.cpp

2.2.方法二:正交平面辅助求解

三维坐标系中三个正交平面为XOY、YOZ、ZOX平面,只要空间平面不与某正交平面(如XOY平面)平行,那么一定有交线,且线上有一点,其Z坐标为0(如果选用了XOY平面),这样将z=0带入平面方程组,求解,此方法和上述方法一本质上是一样的。在方法一中对应的方式是令z=t。

可参考如下实现,和方法一类似,同样需要一些特殊处理,

空间平面相交的直线的计算及其源码_平面的交线计算原理-CSDN博客

2.3.方法三:构造第三平面

两平面法向叉乘可得交线方向,过某点(如平面1上的点或平面2上的点)以其为法向构造第三平面,三平面交于一点(如果平面1和平面2不平行),求该点作为交线上的点。

可直接套用公式,

Plane-Plane Intersection -- from Wolfram MathWorld

Hessian Normal Form -- from Wolfram MathWorld

Intersects of 3 planes_intersectplanes(plane p1, plane p2, plane p3)-CSDN博客

注意构造的第三平面可以过特定点,这样得到的交线上的点距离该特定点最近。

2.4.方法四:几何法

  1. 求plane1上点到plane2的距离;
  2. 求2个plane的夹角;
  3. 根据夹角求asin得到disExpand;
  4. ptOnPlane1沿dirOffset偏移disExpand得到交线上点;

这种方法得到的点距离点ptOnPlane1最近。

此方法对于需要以距离特定点最近的点来表示直线的情况比较实用,毕竟如果直线上的点非常远时,由于浮点存储机制所带来的精度误差会带来负面影响。

3.精度

一般情况下,公式简洁有效,计算逻辑简单,精度就比较高,当然不是绝对的,也与所选参数的情况、运算过程的主动精度损失等有关系,需要根据具体情况进行精度的分析和测试。

相关文章:

  • kafka的架构和工作原理
  • 在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn
  • 25、深度学习-自学之路-卷积神经网络基于MNIST数据集的程序展示
  • 14.1 Auto-GPT 项目定位与价值解读:揭开自主智能体的神秘面纱
  • 商品按图搜索拍立淘API接口系列概述
  • matplotlib中pyplot的基本使用
  • jvm 线程监控调试
  • Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
  • 理解 package.json :在基于 TypeScript 开发 Babylon.js 项目中的关键角色
  • DeepSeek底层揭秘——知识图谱与语料库的联邦学习架构
  • 今日AI和商界事件(2025-02-13)
  • 实现pytorch注意力机制-one demo
  • 业务干挂数据库,Oracle内存分配不足
  • css:position
  • K8s之存储卷
  • Prompt通用技巧
  • redis sentinel模式 与 redis 分片集群 配置
  • (五)Spring Boot学习——spring security +jwt使用(前后端分离模式)
  • iOS实现生物识别
  • git: 如何查询某个文件或者某个目录的更新历史
  • javacms开源免费/长沙正规竞价优化推荐
  • 英文网站建设580/百度自媒体平台
  • b2b网站推广方法/竞价专员是做什么的
  • 大学生做政府网站/友情链接交换方式有哪些
  • 网站二级栏目/梅州seo
  • 温州网站升级/最全bt磁力搜索引擎索引