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

几何算法——4.交线(intersection curve)的表达与参数化、微分性质

几何算法——4.曲面求交的交线(intersection curve)的表达与参数化、微分性质

  • 1 关于曲面求交的交线表达
  • 2 交线的微分性质
  • 3 交线的参数化
  • 4 修正弦长参数化的微分性质

1 关于曲面求交的交线表达

两个曲面求交,比较经典的方法是用跟踪法(具体算法此步就不再详述),跟踪法得到的是若干个交点信息的列表(下文称“交点表”)。

在交点表中的每一个交点,都会保存有【交点坐标point,在曲面s1的uv参数、曲面s2的uv参数,还可以附加其他信息譬如是否是奇异点等】

这样若干个这样的交点,也可以用来插值成nurbs曲线,作为交线的简化形式。但是我们为了保证交线的精确性,创建了交线这种曲线作为一种基本的类型。

求交结果的记录:

struct IntPoint
{Point3d position;   // positionUVParam uvParam0;   // surface0 parameterUVParam uvParam1;   // surface1 parameterdouble param;       // curve parameter
}std::vector<IntPoint> intPointsChart;

由于交线表达的复杂性,存在很多特殊的地方(譬如说奇异点等),所以交线的定义或复杂一些,包含更多的信息:

struct IntCurve
{// the surfaces informationstd::shared_ptr<Surface> m_surface0;std::shared_ptr<Surface> m_surface1;intPointsChart intPtsChart;//Terminator start;//Terminator end;bool isParametried;
};

2 交线的微分性质

既然将交线作为一种基本曲线,那么肯定就需要计算交线的一些基本的微分性质等。

在使用跟踪法计算交线的的时候,会利用两个曲面的法相计算交线的切向;利用两个曲面的偏u、偏v计算交线的曲率等。具体的计算方法,甚至于两个曲面相切的情况微分性质的计算方法可以参考叶修梓的论文1^11
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1^11:Differential geometry of intersection curves of two surfaces. 当然也有很多其他论文可以参考,但是我遇到过有的论文有推导的公式有笔误,叶修梓这篇文章我仔细推导过没有问题。

3 交线的参数化

上一篇ppt中讲的是微分计算,但是这个计算是利用第二基本形式计算推导的,可以理解为弧长参数化计算的

而在实际交线计算中,有需要反求参数等这种操作,如果用弧长参数化,参数节点值计算、反求参数等会特别麻烦,需要大量计算会影响效率

因此比较方便快捷的方法是积累弦长参数化的方法,简单来说就是利用交点表中的点当作折线段来计算参数区间(类似polyline),但是用积累弦长参数化存在的问题是在交点处不连续而曲线实际是连续的

因此,采用修正弦长参数化方法,在交点处根据前后弦的方向转交计算一个缩放因子,保证连续性

注:曲面第一第二基本形式、弦长参数化、修正弦长参数化方法可参考the nurbs book和施法中的计算机辅助几何设计。

4 修正弦长参数化的微分性质

在说修正弦长参数化的微分性质前,先说一下弦长参数化的微分性质:
从弦长参数化到弧长参数化,差的就是一个从弦长参数化到弧长参数化的曲率因子,在弧长参数化的微分上,乘上一个弦长到弧长参数化的曲率因子就行

从修正弦长参数化到弦长参数化,差的就是一个转角处的修正因子,也是乘上一个修正因子就行
在这里插入图片描述

如果用弧长参数化的方法,不好的地方在于,计算交点处节点值慢,节点值要用高斯积分计算弧长

还有一种参数化方法?就是弦法平面与线求交的交点一一对应,反求参数会快很多,但是这个地方存在一个问题就是,反求参数计算方便了,但是反求参数计算的不是垂足点?这样算是一种参数化?
在这里插入图片描述

http://www.lryc.cn/news/58892.html

相关文章:

  • 【GPT】让你事半功倍特别好用的5个GPT工具
  • 人工智能大模型多场景应用原理解析
  • SpringBoot默认包扫描机制与默认配置文件
  • RabbitMq 消息可靠性问题(一) --- publisher发送时丢失
  • Java初识泛型
  • 寸照换底色技巧大全,超详细图文教程
  • 这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】
  • muduo源码剖析--Buffer
  • AI人工智能简介和其定义
  • python数据清洗
  • Python3 os.makedirs() 方法、Python3 os.read() 方法
  • 【Linux安装数据库】Ubuntu安装mysql并连接navicat
  • GaussDB工作级开发者认证—第一章GaussDB数据库介绍
  • 阿里张勇:所有行业都值得用大模型重新做一遍!
  • ES6(字符串的扩展与新增方法)
  • rk3568点亮LCD(lvds)
  • 全终端办公电子邮件集成方案
  • 再不转型为ChatGPT程序员,有遭受降维打击的危险
  • maven使用教程
  • Emlog底部显示当前在线人数
  • 【java踩坑搞起】MybatisPlus封装的mapper不支持 join,那咋办
  • 【创造者】——什么是数学
  • ROS系列——错误syntax error near unexpected token `$‘do\r‘‘
  • 当星辰天合 SDS 遇见 Elastic
  • 使用vue实现分页
  • 白银实时行情操作中的一些错误及其解决办法(下)
  • Linux系统之tomcat的安装方法
  • 段式回文。
  • 易点易动设备管理系统高效管理海量备品备件
  • CMMI 3.0 究竟包含了哪些实践域?