static bool GetProfile(
List<List<XYZ>> polygons,
Solid solid,
XYZ v,
XYZ w)
{
double d, dmax = 0;
PlanarFace outermost = null;
FaceArray faces = solid.Faces;
foreach( Face f in faces )
{
PlanarFace pf = f as PlanarFace;
if( null != pf
&& Util.IsVertical( pf )
&& Util.IsZero( v.DotProduct( pf.FaceNormal ) ) )
{
d = pf.Origin.DotProduct( w );
if( ( null == outermost )
|| ( dmax < d ) )
{
outermost = pf;
dmax = d;
}
}
}
if( null != outermost )
{
XYZ voffset = _offset * w;
XYZ p, q = XYZ.Zero;
bool first;
int i, n;
EdgeArrayArray loops = outermost.EdgeLoops;
foreach( EdgeArray loop in loops )
{
List<XYZ> vertices = new List<XYZ>();
first = true;
foreach( Edge e in loop )
{
IList<XYZ> points = e.Tessellate();
p = points[0];
if( !first )
{
Debug.Assert( p.IsAlmostEqualTo( q ),
"expected subsequent start point"
+ " to equal previous end point" );
}
n = points.Count;
q = points[n - 1];
for( i = 0; i < n - 1; ++i )
{
XYZ a = points[i];
a += voffset;
vertices.Add( a );
}
}
q += voffset;
Debug.Assert( q.IsAlmostEqualTo( vertices[0] ),
"expected last end point to equal"
+ " first start point" );
polygons.Add( vertices );
}
}
return null != outermost;
}