几何算法——4.曲面求交的交线(intersection curve)的表达与参数化、微分性质
- 1 关于曲面求交的交线表达
- 2 交线的微分性质
- 3 交线的参数化
- 4 修正弦长参数化的微分性质
1 关于曲面求交的交线表达
两个曲面求交,比较经典的方法是用跟踪法(具体算法此步就不再详述),跟踪法得到的是若干个交点信息的列表(下文称“交点表”)。
在交点表中的每一个交点,都会保存有【交点坐标point,在曲面s1的uv参数、曲面s2的uv参数,还可以附加其他信息譬如是否是奇异点等】
这样若干个这样的交点,也可以用来插值成nurbs曲线,作为交线的简化形式。但是我们为了保证交线的精确性,创建了交线这种曲线作为一种基本的类型。
求交结果的记录:
struct IntPoint
{
Point3d position; // position
UVParam uvParam0; // surface0 parameter
UVParam uvParam1; // surface1 parameter
double param; // curve parameter
}
std::vector<IntPoint> intPointsChart;
由于交线表达的复杂性,存在很多特殊的地方(譬如说奇异点等),所以交线的定义或复杂一些,包含更多的信息:
struct IntCurve
{
// the surfaces information
std::shared_ptr<Surface> m_surface0;
std::shared_ptr<Surface> m_surface1;
intPointsChart intPtsChart;
//Terminator start;
//Terminator end;
bool isParametried;
};
2 交线的微分性质
既然将交线作为一种基本曲线,那么肯定就需要计算交线的一些基本的微分性质等。
在使用跟踪法计算交线的的时候,会利用两个曲面的法相计算交线的切向;利用两个曲面的偏u、偏v计算交线的曲率等。具体的计算方法,甚至于两个曲面相切的情况微分性质的计算方法可以参考叶修梓的论文
1
^1
1:
注
1
^1
1:Differential geometry of intersection curves of two surfaces. 当然也有很多其他论文可以参考,但是我遇到过有的论文有推导的公式有笔误,叶修梓这篇文章我仔细推导过没有问题。
3 交线的参数化
上一篇ppt中讲的是微分计算,但是这个计算是利用第二基本形式计算推导的,可以理解为弧长参数化计算的
而在实际交线计算中,有需要反求参数等这种操作,如果用弧长参数化,参数节点值计算、反求参数等会特别麻烦,需要大量计算会影响效率
因此比较方便快捷的方法是积累弦长参数化的方法,简单来说就是利用交点表中的点当作折线段来计算参数区间(类似polyline),但是用积累弦长参数化存在的问题是在交点处不连续而曲线实际是连续的
因此,采用修正弦长参数化方法,在交点处根据前后弦的方向转交计算一个缩放因子,保证连续性
注:曲面第一第二基本形式、弦长参数化、修正弦长参数化方法可参考the nurbs book和施法中的计算机辅助几何设计。
4 修正弦长参数化的微分性质
在说修正弦长参数化的微分性质前,先说一下弦长参数化的微分性质:
从弦长参数化到弧长参数化,差的就是一个从弦长参数化到弧长参数化的曲率因子,在弧长参数化的微分上,乘上一个弦长到弧长参数化的曲率因子就行
从修正弦长参数化到弦长参数化,差的就是一个转角处的修正因子,也是乘上一个修正因子就行
如果用弧长参数化的方法,不好的地方在于,计算交点处节点值慢,节点值要用高斯积分计算弧长
还有一种参数化方法?就是弦法平面与线求交的交点一一对应,反求参数会快很多,但是这个地方存在一个问题就是,反求参数计算方便了,但是反求参数计算的不是垂足点?这样算是一种参数化?