- 博客(30)
- 收藏
- 关注
原创 计算几何基础算法——直线与平面求交
还是继续写基础算法,为后续复杂算法做铺垫。这篇文章中要介绍的直线与平面求交,是用的非常广泛的基础算法之一。像三维射线法、几何信息采样等很多算法都会用到该算法,它也可以用到曲线与曲面求交迭代过程中。本文介绍的算法,不会像中学数学中那样列方程组来求解,而是通过几何意义更明确的向量运算来求解。几何意义明确的好处就是算法里涉及到确定精度的地方,精度也有明确的几何意义,方便多算法间的精度统一。做几何算法一定要熟练掌握向量的各种运算和应用,直线与平面求交就是一个典型的应用场景。
2025-03-13 22:27:01
671
原创 几何造型之Bezier曲线拟合详解
曲线拟合是几何造型中非常常见的算法。本文以最简单的样条曲线(Bezier曲线)来讲解曲线拟合实现的基本原理。Bezier在实际中应用中远远没有Nurbs广泛,但其公式简单,作为入门比较合适。我后续也会推出Nurbs相关的系列文章。Bezier曲线相关公式和性质,可参考如下两篇文章。深入理解Bezier曲线曲面之伯恩斯坦多项式详解深入理解Bezier曲线常用算法Bezier曲线拟合是指通过给定的一组数据点,找到一条Bezier曲线,使得这条曲线尽可能接近给定的数据点。
2025-03-12 23:42:31
831
原创 深入理解Bezier曲线常用算法
前一篇文章中我们对Bezier曲线曲面的基础数学工具伯恩斯坦多项式及其相关性质做了介绍,那篇文章直达链接如下:设Bezier曲线的方程为:Cti0∑nBintPi这篇文章将详细介绍Bezier曲线的常用算法及其证明。
2025-03-11 23:53:58
567
原创 深入理解Bezier曲线曲面之伯恩斯坦多项式详解
Bezier曲线曲面是几何造型的基础,在图形学这门课中也会涉及到。因为能力的限制,Bezier在实际应用中用的其实并不多,主要还是用它的近亲——Nurbs。但B样条和Nurbs对于初学者来说还是有点过于复杂了。Bezier作为最基础的样条,更适合入门的。本篇文章作为Bezier曲线曲面的第一篇,会对与其相关的常用数学公式做详细介绍。文章格式是在每节都先直接列出公式,如果公式比较复杂后面会给出具体推导过程。读者。
2025-03-10 23:57:44
1003
原创 判断点与多边形位置关系的射线法详解及误差稳定性优化
射线法是一种用于判断点和多边形位置关系的经典算法,在计算机图形学、几何算法等领域有着非常广泛的应用。它能够支持复杂形状的多边形,包括凹多边形和带洞的多边形。射线法的思想,也同样适用于判断三维点与实体的位置关系。因为其应用广泛,所以它的稳定性至关重要。本文会先对射线法的基本原理和实现做详细介绍;后面会举一个射线法思想在其他方面应用的例子来进一步理解这个思想;最后会结合实践给出导致射线法不稳定的常见情况及解决方案。
2025-03-07 00:43:06
570
原创 计算几何基础算法——直线与直线求交
还是继续先写基础算法,有了基础算法,复杂算法就容易讲解了。我更希望自己像写书而不是写论文。书由浅入深,论文需要比较好的基础才能读懂。这篇文章中要介绍的直线与直线求交,是用的非常广泛的基础算法之一。像射线法、几何信息采样等很多算法都会用到该算法,它也可以用到曲线求交迭代过程中。本文介绍的算法,不会像中学数学中那样列方程组来求解,而是通过向量运算来求解。做几何算法一定要熟练掌握向量的各种运算和应用,直线与直线求交就是一个典型的应用场景。关于向量运算不熟悉的朋友可以查看下面这篇文章。
2025-03-05 22:50:24
738
原创 计算几何基础算法——点与线段的最短距离
本来想直接写那些复杂的几何算法的。但考虑到复杂算法也都是基础算法组成的,为了各个级别的朋友读起来都能轻松一些,决定还是从用的最多的基础算法写起。写复杂算法的时候,就可以直接把这些基础算法的链接放进去,方便不太熟悉的朋友查阅。这篇文章中要介绍的点与线段的最短距离,就是用的非常广泛的基础算法之一。在很多复杂算法的临界情况都需要判断点是否在线段上,即判断点到线段的最短距离是否小于某个容差。
2025-03-05 00:19:14
630
原创 计算几何中浮点数误差稳定的线段与线段是否相交判定算法
线段与线段是否相交判定算法是计算几何中基础算法之一,一般的计算几何说都会对该算法做讲解。但大部分书中给出的算法都不能做到在浮点数误差存在的情况下稳定。本文会先对基础算法进行介绍,顺便让大家熟悉一下向量的应用。做几何算法研发,熟悉用向量而不是数值来求解问题是一项基本能力。重点会在文章最后针对实际应用中的误差情况作出分析并给出一个稳定的判定算法。
2025-03-04 21:15:01
744
原创 工业软件心脏—几何核心库研发的四大核心能力
几何核心库,称为工业软件的心脏一点都不为过,也是目前工业软件卡脖子的核心技术之一。本文重点总结一下几何核心库研发中碰到的难点,最后会给出我认为的如果想在该行业深耕需要重点培养的四大核心能力。作者曾从零开始完成了某上市公司自主的几何算法核心的研发,亲手实现了里面绝大部分核心代码。目前基于它的公司内部产品至少有几十个了。所以下面要讲的更多是本人实际经验的总结会更具体。例如我不会把数学能力列为核心能力,虽然它确实是最重要的。但数学能力重要,是人人都知道,而且确实有点太虚了,指导意义不大。
2025-03-02 23:17:12
887
原创 三维变换矩阵深度理解之变换矩阵分解
三维变换矩阵在几何核心库、渲染引擎、游戏开发等多个方面都有广泛的应用。在实际应用中,我们有时候需要单独使用三维变化的平移、旋转或缩放解决业务问题。本文将详细讲解将三维变换矩阵拆分为平移、旋转、缩放的分解算法,同时也作为对前一篇文章的理解加强。了解了原理,一定会发现这个看似麻烦的问题解决起来非常简单。作者的写作目标就是把复杂抽象的数学问题和实际工作相结合,通俗易懂的介绍给大家。如果没有读过前一篇文章的建议先读一下,链接如下一文彻底弄懂三维变换矩阵本文以后用“上篇文章”代替该文章。
2025-02-28 22:28:19
883
原创 一文彻底弄懂三维变换矩阵
三维变换矩阵是计算机图形学中处理三维空间几何变换的核心数学工具。它通过一个4x4的齐次坐标矩阵,统一表示几何体的平移、旋转和缩放。本文先从数学角度对相关理论进行介绍,文章最后会从几何意义角度再次理解三维变换,让读者以更直观的方式将三维变换矩阵彻底搞懂。!
2025-02-27 23:39:06
332
原创 三维模型的B-Rep表示详解
B-Rep是一种三维实体的边界表示法,它在三维实体建模中应用非常广泛。B-Rep的优点如下:支持曲线曲面,能够更准确的表示复杂形状。非常有利于绝大多数几何算法的开发,正确性也更容易验证。在满足精度要求的前提下,一个曲面往往需要很多个平面才能表示。B-Rep的唯一缺点应该就是复杂度高了,主要体现在两个方面需要具备很强的非线性方程组求解能力。B-Rep能描述的情况多(例如环允许非凸、带内环等各种情况),算法处理时都要考虑。下面我将对B-Rep数据结构做一个详细介绍。
2025-02-25 21:54:08
451
原创 多边形顺逆时针判定算法详解
多边形顺逆时针判定解决的问题是给一个多边形的顶点列表或者边列表,判断该多边形是顺时针还是逆时针。多边形顺逆时针判定算法在几何算法中应用十分广泛。因为很多几何算法都需要要根据几何的拓扑结构,为了方便,往往规定外环多边形是逆时针,内环多边形是顺时针。除了介绍算法,作者还会关于误差对算法稳定性影响有详细介绍。更多几何算法,欢迎关注作者gongzhonghao:几何算法。
2025-02-24 22:27:13
1086
原创 多边形面积计算算法
首先界定一下本算法中多边形的范围,不存在自交和内环。如果多边形存在自交,需要在自交位置分割再应用本算法;如果包含内环,本文算法能单独计算每个环的面积。更多几何算法,欢迎关注公众号:几何算法。
2025-02-21 23:41:06
890
原创 最通俗易懂的用于非线性方程组求解的同伦延拓法
收敛性问题,是非线性方程组求解中一个最让人头疼的问题,没有之一。当在网络上查询数值法求解非线性方程组如何保证收敛时,得到的结论往往是选择一个合适的初值。什么叫合适的初值呢,就是接近方程组的解的值。而实际情况是,绝大多数场景下,我们并不知道方程组的解在哪,也就谈不上如何去接近它了。同伦延拓法可以通过引入同伦参数,将原始问题与一个简单问题连接起来,逐步过渡到原始问题的解,从而减少对初始值的依赖。
2025-02-08 23:13:05
260
原创 非线性方程组求解之各种牛顿迭代类算法
本文会介绍广义的牛顿类算法的本质逻辑,这类算法包括各种牛顿法、各种拟牛顿法、阻尼牛顿法等。理解了本文,对常见的迭代类算法(例如Levenberg-Marquardt、BFGS、DFP等)也就能轻松理解了,同时也能轻松实际出特有的迭代类算法来解决具体的业务问题。牛顿法也存在一些固有的问题,首先是它每次只能迭代到方程组的一个根,这个根不一定是业务需要的根。其次它的绝对收敛条件很难满足,所以初值的选取就很关键,不好的初值会导致收敛慢甚至不收敛。该方法属于不动点迭代的一种,通过迭代的方式不断逼近方程组的真实解。
2025-01-09 23:46:43
236
原创 图形算法库研发(十):几何空间索引——R树
一种是查找某个实体,这种是直接拿实体的Box和节点数组中的Box做比较,如果在它内部则遍历该Box的子节点,直到叶节点,最后比较一下实体。选择插入位置的算法很多,这里推荐Box增加最小算法,即拿新插入的Box和节点中的每个Box做并,选择使Box增加最小的作为递归遍历的子节点。做磁盘索引时可以类比B树,节点数组的最大长度比较大,这样树的高度比较低,每次查询IO操作的次数会比较少(每次IO读取一整个节点),因为根节点每次都会访问到,所以要常驻内存。R树是一棵平衡树,它的平衡原理和B树一样,靠由下向上的分裂。
2024-07-14 23:15:46
812
原创 图形算法库研发(九):模型定义与关系处理
普通Undo/Redo,Undo后修改,被Undo的日志可以直接清掉了,但数据同步后Undo,再修改就不能清掉,因为下次同步还需要将Undo也同步了,这时候就需要增加一个保存点的设计来管理哪些日志能清,哪些不能。第二,日志是会组合的,我们一般Undo/Redo的不是单条修改,而是一批命令,例如我们画一条线,要添加一条线,设置第一个顶点,设置第二个顶点,这三条修改应该作为一个组合命令Undo/Redo一次,而不是三次。鉴于这些问题的复杂度,我们需要很高的抽象能力,同时也会涉及很多的概念和细节。
2024-07-14 23:12:40
1052
原创 图形算法库研发(八):高效精准的多项式值域估计算法
多项式是几何内核中比较常见的表达式(Bezier、Nurbs等),多项式值域精准高效的估计,严重影响区间类迭代算法的收敛速度。根据该多项式,通过计算极值点,很容易计算其值域区间为[21, 28],我们不推荐直接这样做的原因是因为计算极值点的效率有点低。在本算法中,我们做的工作是求出该式中的pi,并根据pi计算闭包作为多项式的值域估计。需要注意的是,u属于[0, 1],所以首先需要将多项式的变量x变换到[0, 1]。采用本文算法,u的采样点选为0,1/3,2/3,1。最终计算出的值域区间为[21, 31]。
2024-05-29 21:19:46
273
1
原创 图形算法库研发(七):三维曲线求交算法与结果演示
和OpenCaseCade对比,同样配置,OpenCaseCade用IntTools_EdgeEdge来实现三维线求交,相同数据和配置,1000次普通求交就要1.159秒,接近重合情况运行1000次需要50多秒,效率远超OpenCaseCade。演示代码如下所示,测试了Nurbs曲线的相交、重合、接近重合三种常见情况,每个运行1000次并输出计时和计算结果。算法是支持方程数多于变量数的,所以原理上不需要任何特殊处理。原理一致,唯一的区别就是方程组多了一个维度。从结果来看,效率和稳定性都还是不错了。
2024-05-13 22:06:01
379
原创 图形算法库研发(六):通用的二维曲线求交算法
特殊求交(例如直线与圆弧、圆弧与圆弧等)虽然是提速的好办法,但它们相对简单,只是工作量的问题,本文就不做针对性描述了。
2024-04-04 22:49:54
2191
1
原创 图形算法库研发(五):非线性方程组求解
基于上面的需求,WGP实现了一个方程组求解器,它的核心算法是在区间迭代法上做了改造。WGP的方程组求解器,由一个方程组定义(EquationSystem)和一个求解器组成(Solver),下面是一个直接调用最基础源码的例子。非线性方程组求解是图形算法库核心中的核心、曲线与曲线求交、曲线与曲面求交、曲面与曲面求交、空间距离检测、曲面求交内环检测等等等等。当然,区间迭代法有很多不足之处,我们只是借鉴了它的思想,设计出了我们独有的数值算法。关于区间迭代法思想的说明,可以看我下面的这篇文章。
2024-03-15 00:02:01
546
1
原创 图形算法库研发(四):OpenCASECADE的二维曲线求交算法验证
结果非常不理想,求出2个点和1段重合线,和我预期不太一致,用时方面这次1000次用了3.08635秒,算是非常慢了,可能OpenCASECADE有检测重合的算法,但即使有,每次求交都调重合监测,也不好。接近重合情况还是很常见的,也是最容易出错的,可见OpenCASECADE表现的并不好,计算结果错误,没有找到交点,耗时也不少,1000次耗时1.68328秒。1000次用时0.065093秒,还是不错的。首先看看我们的对标产品实现的怎么样。读者也可以当个学习的Demo来用。先从简单的入手,二维曲线求交。
2024-03-11 22:30:20
496
1
原创 图形算法库研发(三):快速在Visual Studio 2022环境下编译OpenCASECADE
但这个bat并不支持VS2022,所以既然我们要快速运行起来,又不想修改系统的环境变量,所以直接在项目里加吧。在这个项目中,我只是希望将OpenCASECADE作为对标工具,并不是用它来做具体项目,所以,我的目标是能在我的Visual Studio 2022下快速编译并跑起来一个Demo,并不需要完美的配置它,所以直接在VS里配置了绝对路径。2、尝试编译,会有部分project有找不到头文件或者lib文件,看似报了很多错,经过验证,实际需要调整的不多,主要是引用的第三方库找不到。添加完直接编译就可以了。
2024-03-11 21:54:55
688
2
原创 图形算法库研发(二):浮点数误差问题的处理逻辑
这个歧义的消除,就需要算法都统一到距离误差下,但统一到距离误差下往往会使算法变慢,所以,折中的方案是两个角度误差,一大一小,小于小的绝对重合,大于大的绝对不重合,两者之间的转为距离误差的算法。不夸张的说,因为这个问题的存在,几乎所有图形算法都不能完全按书上的实现,哪怕是最简单的判断点内外的射线法,在接近重合以及几何体不完美的情况下也会出错,都需要特殊处理(这个几何体不完美指的是几何体经过若干运算后,本身就带了误差,这个是必然会出现的)。因为情况太多了,不能一一列举,只能高度抽象,重要的是思想。
2024-03-10 17:12:29
911
1
原创 图形算法库研发(一):对标产品的选择
虽然据传说OpenCASECADE不如那几个商业引擎(本人并未考证,不对这句话真实性负责),但它应用的也足够广泛,最重要的是开源,这就使更深入细节的对比成为可能。在精力有限的情况下,OpenCASECADE明显是日常开发中最好的对标产品。目前,本人对OpenCASECADE的了解非常少,还需不断学习。后续除了会把自己开发过程中的核心技术和代码分享之外,也会把对OpenCASECADE的学习一起分享。既然要做一个世界级的图形算法库,首先还是选一个对标产品。综合来看OpenCASECADE是最合适的。
2024-03-10 16:47:45
208
1
原创 兼具代数法稳定性和数值法计算效率的Python方程组求解库——wsolver
采用数值方法,能稳定高效的计算出方程组定义域内的所有实根。除Python库外,也提供C语言库和Webassembly库。目前针对的是通用场景,也可针对特殊场景(例如几何求交)定制开发,计算效率更优。
2024-03-08 23:43:58
465
1
原创 数值法解非线性方程组全部实根最可行的算法——区间迭代法的几何意义
介绍这个算子的资料也很容易查找到,这里就不做详细展开了,这里只介绍关于矩阵Y的一个非常重要的直观理解, 这个直观理解几乎没有资料提到,但对我们构造一个快速收敛的迭代至关重要。不用担心,本文将跳过那些抽象的公式,从直观的角度讲解如何更深入的理解区间迭代法。图3表示的是将曲线旋转一个角度, 可以看出这时候两个曲线包围盒的相交区域明显变小,也就意味着迭代可以快速收敛到一个很小的区域。数值法解方程组是一个综合性的方法,每种独立的方法都有自身的局限性,而且还要考虑浮点数本身的舍入误差对计算结果稳定性的影响。
2024-03-08 21:12:58
921
1
原创 几何算法库中的浮点数误差问题
这个歧义的消除,就需要算法都统一到距离误差下,但统一到距离误差下往往会使算法变慢,所以,折中的方案是两个角度误差,一大一小,小于小的绝对重合,大于大的绝对不重合,两者之间的转为距离误差的算法。不夸张的说,因为这个问题的存在,几乎所有图形算法都不能完全按书上的实现,哪怕是最简单的判断点内外的射线法,在接近重合以及几何体不完美的情况下也会出错,都需要特殊处理(这个几何体不完美指的是几何体经过若干运算后,本身就带了误差,这个是必然会出现的)。所以,浮点数误差问题的根本解就是歧义检测与歧义处理。
2023-08-09 19:41:27
114
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人