OCCT中的裁剪平面(Geom_RectangularTrimmedSurface)
程序员文章站
2022-04-15 18:45:13
...
裁剪平面(Geom_RectangularTrimmedSurface)是基础平面的一部分,它在基础平面的u方向上用两个值限制范围,在基础平面的v方向上也用两个值限制范围。裁剪平面的区域一定位于基础平面的区域内,它的定义如下:
- 基础面
- u方向和v方向的参数值(umin, umax) 和(vmin, vmax)。裁剪平面是在基础面的一份拷贝上做裁剪,因此,当基础面改变时,裁剪平面不变。另外,裁剪平面的方向可以和基础平面不同(默认情况下,两者是相同的)。
在OCCT中,构造一个裁剪平面的方法如下:
Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
const Handle(Surface)& S,
const Standard_Real U1,
const Standard_Real U2,
const Standard_Real V1,
const Standard_Real V2,
const Standard_Boolean USense,
const Standard_Boolean VSense)
: utrim1 (U1),
vtrim1(V1),
utrim2 (U2),
vtrim2 (V2),
isutrimmed (Standard_True),
isvtrimmed (Standard_True)
{
// kill trimmed basis surfaces
Handle(Geom_RectangularTrimmedSurface) T =
Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
if (!T.IsNull())
basisSurf = Handle(Surface)::DownCast(T->BasisSurface()->Copy());
else
basisSurf = Handle(Surface)::DownCast(S->Copy());
Handle(Geom_OffsetSurface) O =
Handle(Geom_OffsetSurface)::DownCast(basisSurf);
if (!O.IsNull())
{
Handle(Geom_RectangularTrimmedSurface) S2 =
new Geom_RectangularTrimmedSurface( O->BasisSurface(),U1,U2, V1, V2, USense, VSense);
Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
basisSurf = Handle(Surface)::DownCast(OS);
}
SetTrim( U1, U2, V1, V2, USense, VSense);
}
裁剪面在u方向上的范围是[u1,u2],在v方向上的范围是[v1,v2]。这两个方向可以推导出面的法向量。如果面是非周期性的,z则不使用USense 和VSense 。如果面是周期性的,则使用USense 和VSense。默认情况下,裁剪面和和基础面的方向相同,且非闭合、非周期性。
在下列情况下,构造时会有异常:
- 基础面在U方向上不是周期性,但u1或者u2超出了基础面的边界。
- 基础面在V方向上不是周期性,但v1或者v2超出了基础面的边界。
- u1 = u2
- v1 = v2
Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
const Handle(Geom_Surface)& S,
const Standard_Real Param1,
const Standard_Real Param2,
const Standard_Boolean UTrim,
const Standard_Boolean Sense
) {
// kill trimmed basis surfaces
Handle(Geom_RectangularTrimmedSurface) T =
Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
if (!T.IsNull())
basisSurf = Handle(Surface)::DownCast(T->BasisSurface()->Copy());
else
basisSurf = Handle(Surface)::DownCast(S->Copy());
Handle(Geom_OffsetSurface) O =
Handle(Geom_OffsetSurface)::DownCast(basisSurf);
if (!O.IsNull())
{
Handle(Geom_RectangularTrimmedSurface) S2 =
new Geom_RectangularTrimmedSurface( O->BasisSurface(),Param1,Param2, UTrim, Sense);
Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
basisSurf = Handle(Surface)::DownCast(OS);
}
SetTrim(Param1, Param2, UTrim, Sense);
}
基础面仅在一个参数方向上裁剪。如果UTrim = True,则在U方向上裁剪,否则在V方向上裁剪。在裁剪方向上,面的范围从Param1到Param2。如果基础面是周期性的,则Sense给出了面的可用部分。默认情况下,裁剪面与基础面的方向(在考虑的裁剪方向上)相同。
在下列情况下,构造时会有异常:
- 基础面在裁剪方向上不是周期性,但Param1或者Param2超出了基础面的边界。
- Param1 = Parram2