- All Implemented Interfaces:
Shape3D
,SurfaceOps
- Enclosing class:
- Surface3D
Although stored as double-precision numbers, when a surface feature is created, the control points are rounded to the nearest float value by first casting the value as a float and then recasting it as a double. This rounding is done to reduce the chances that two expressions that are intended to compute the same coordinate will not result in different values being stored due to double-precision errors.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.bzdev.geom.Surface3D
Surface3D.Boundary, Surface3D.Double, Surface3D.Float
-
Constructor Summary
ConstructorsConstructorDescriptionDouble()
Constructor for an oriented surface.Double
(boolean oriented) Constructor specifying if the surface has an orientation.Double
(int initialCapacity) Constructor for an oriented surface giving an estimate of the number of surface segments.Double
(int initialCapacity, boolean oriented) Constructor giving an estimate of the number of surface segments and specifying if the surface has an orientation.Constructor using another surface to determine the initial surface segments and the surface's orientation.Constructor for a surface that initially contains the surface segments from multiple surfaces or shapes.Double
(Shape3D surface, Transform3D transform) Constructor using another surface to determine the surface's orientation and initial surface segments, modified with a 3D transform. -
Method Summary
Modifier and TypeMethodDescriptionfinal void
addCubicPatch
(double[] controlPoints, Color color, Object tag) Add a cubic Bézier patch to this surface, specifying a color and a tag.final void
addCubicTriangle
(double[] controlPoints, Color color, Object tag) Add a cubic Bézier triangle to this surface, specifying a color and a tag.final void
addCubicVertex
(double[] controlPoints, Color color, Object tag) Add a cubic vertex to this surface, specifying a color and tag.final void
addFlippedCubicPatch
(double[] controlPoints, Color color, Object tag) Add a cubic Bézier patch to this surface, specifying a color and a tag, and reversing the patch's orientation.final void
addFlippedCubicTriangle
(double[] controlPoints, Color color, Object tag) Add a cubic Bézier triangle to this surface, specifying a color and a tag, and reversing the triangle's orientation by exchanging its U and V coordinates, Cubic Bézier triangles uses barycentric coordinates u, v, and w, where u + v + w = 1 and all three coordinates are in the range [0,1].final void
addFlippedCubicVertex
(double[] controlPoints, Color color, Object tag) Add a flipped cubic vertex to this surface, specifying a color and tag.final void
addFlippedPlanarTriangle
(double[] controlPoints, Color color, Object tag) Add a planner triangle to the surface, reversing the triangle's orientation by exchanging the triangle's U and V coordinates, and specifying a control-point array, a color, and a tag.final void
addPlanarTriangle
(double[] controlPoints, Color color, Object tag) Add a planner triangle to the surface, specifying a control-point array, a color, and a tag.final void
Append the surface segments specified by a surface iterator.clone()
void
computeBoundary
(Appendable out, boolean multipleEdges) Compute the boundary of this surface.createTransformedSurface
(Transform3D transform) Create a new surface by applying a transform to this surface.protected final void
getSegment
(int length, int offset, double[] scoords) Get a segment's control points.final SurfaceIterator
getSurfaceIterator
(Transform3D tform) Get a surface iterator for this Shape3D.final SurfaceIterator
getSurfaceIterator
(Transform3D tform, int level) Get a surface iterator for this Shape3D, subdividing the surface.final void
Reverse the orientation of this surface.final void
transform
(Transform3D tform) Apply a transform to the surface.Methods inherited from class org.bzdev.geom.Surface3D
addAreaToAdder, addCubicPatch, addCubicPatch, addCubicPatch, addCubicTriangle, addCubicTriangle, addCubicTriangle, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addCubicVertex, addFlippedCubicPatch, addFlippedCubicPatch, addFlippedCubicPatch, addFlippedCubicTriangle, addFlippedCubicTriangle, addFlippedCubicTriangle, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedCubicVertex, addFlippedPlanarTriangle, addFlippedPlanarTriangle, addFlippedPlanarTriangle, addFlippedPlanarTriangle, addFlippedPlanarTriangle, addFlippedPlanarTriangle, addFlippedPlanarTriangle, addPlanarTriangle, addPlanarTriangle, addPlanarTriangle, addPlanarTriangle, addPlanarTriangle, addPlanarTriangle, addPlanarTriangle, addVolumeToAdder, append, append, area, area, centerOfMassOf, centerOfMassOf, centerOfMassOf, centerOfMassOf, centerOfMassOf, centerOfMassOf, checkPatchCorners, checkPatchCorners, configArea, createComponents, cubicVertexToPatch, getBoundary, getBoundaryEdgeNumbers, getBoundarySegmentIndices, getBounds, getComponent, getSegment, getSegmentColor, getSegmentTag, isClosedManifold, isOriented, isWellFormed, isWellFormed, isWellFormed, momentsOf, momentsOf, momentsOf, momentsOf, momentsOf, momentsOf, numberOfComponents, printTag, reset, reverseOrientation, reverseOrientation, segmentValue, segmentValue, segmentValue, segmentValue, setStackTraceMode, setupCP111ForTriangle, setupCP111ForTriangle, setupCP111ForTriangle, setupCP111ForTriangle, setupPlanarCP111ForTriangle, setupRestForPatch, setupRestForPatch, setupU0ForPatch, setupU0ForPatch, setupU0ForTriangle, setupU0ForTriangle, setupU0ForTriangle, setupU1ForPatch, setupU1ForPatch, setupV0ForPatch, setupV0ForPatch, setupV0ForTriangle, setupV0ForTriangle, setupV0ForTriangle, setupV1ForPatch, setupV1ForPatch, setupW0ForTriangle, setupW0ForTriangle, setupW0ForTriangle, size, triangleToPatch, uTangent, volume, volume, vTangent
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.bzdev.geom.Shape3D
getBoundary
-
Constructor Details
-
Double
public Double()Constructor for an oriented surface. A surface is oriented if it has two sides. By convention, for each of the patches and triangles that constitute a surface, the normal vector points in the direction implied by the right hand rule when traversing a patch's or triangle's vertices. By convention, for closed surfaces the normal vector points towards the outside of the surface. -
Double
public Double(boolean oriented) Constructor specifying if the surface has an orientation. A surface is oriented if it has two sides. By convention, for each of the patches and triangles that constitute a surface, the normal vector points in the direction implied by the right hand rule when traversing a patch's or triangle's vertices. By convention, for closed surfaces the normal vector points towards the outside of the surface.- Parameters:
oriented
- true if the surface has an orientation; false if it does not
-
Double
public Double(int initialCapacity) Constructor for an oriented surface giving an estimate of the number of surface segments. A surface is oriented if it has two sides. By convention, for each of the patches and triangles that constitute a surface, the normal vector points in the direction implied by the right hand rule when traversing a patch's or triangle's vertices. By convention, for closed surfaces the normal vector points towards the outside of the surface.- Parameters:
initialCapacity
- the initial number of surface segments allocated in an expandable table
-
Double
public Double(int initialCapacity, boolean oriented) Constructor giving an estimate of the number of surface segments and specifying if the surface has an orientation. A surface is oriented if it has two sides. By convention, for each of the patches and triangles that constitute a surface, the normal vector points in the direction implied by the right hand rule when traversing a patch's or triangle's vertices. By convention, for closed surfaces the normal vector points towards the outside of the surface.- Parameters:
initialCapacity
- the initial number of surface segments allocated in an expandable tableoriented
- true if the surface has an orientation; false if it does not
-
Double
Constructor using another surface to determine the initial surface segments and the surface's orientation. A surface is oriented if it has two sides. By convention, for each of the patches and triangles that constitute a surface, the normal vector points in the direction implied by the right hand rule when traversing a patch's or triangle's vertices. By convention, for closed surfaces the normal vector points towards the outside of the surface.- Parameters:
surface
- the path whose segments will be copied
-
Double
Constructor using another surface to determine the surface's orientation and initial surface segments, modified with a 3D transform. A surface is oriented if it has two sides. By convention, for each of the patches and triangles that constitute a surface, the normal vector points in the direction implied by the right hand rule when traversing a patch's or triangle's vertices. By convention, for closed surfaces the normal vector points towards the outside of the surface.- Parameters:
surface
- the path whose segments will be copiedtransform
- the transform to apply to the surface segments
-
Double
Constructor for a surface that initially contains the surface segments from multiple surfaces or shapes. The surface is oriented if all shapes are oriented.- Parameters:
surface1
- the first surfacesurfaces
- the remaining surfaces
-
-
Method Details
-
getSegment
protected final void getSegment(int length, int offset, double[] scoords) Description copied from class:Surface3D
Get a segment's control points. The values for the offset parameter are determined by the methodSurface3D.getSegment(int, double[])
. As a result, this method should only be used by subclasses.- Specified by:
getSegment
in classSurface3D
- Parameters:
length
- the number of entries in the coords argument that will be filled, starting at index 0offset
- an index indicating where the control point data will be foundscoords
- an array to hold the results
-
append
Description copied from class:Surface3D
Append the surface segments specified by a surface iterator. -
clone
-
createTransformedSurface
Description copied from class:Surface3D
Create a new surface by applying a transform to this surface.- Specified by:
createTransformedSurface
in classSurface3D
- Parameters:
transform
- the transform- Returns:
- the new surface
-
getSurfaceIterator
Description copied from interface:Shape3D
Get a surface iterator for this Shape3D. The surface iterator will represent the shape as a sequence of Bézier patches and Bézier triangles, with the order of the sequence arbitrary.Unless the transform is an affine transform, the transformation is not exact. In this case, the patches and triangles that constitute the surface should be small enough that the transform can be approximated by an affine transform over the region containing the control points.
- Parameters:
tform
- a transform to apply to each control point; null for the identity transform- Returns:
- a surface iterator
-
getSurfaceIterator
Description copied from interface:Shape3D
Get a surface iterator for this Shape3D, subdividing the surface. The surface iterator will represent the shape as a sequence of Bézier patches and Bézier triangles, with the order of the sequence arbitrary.Unless the transform is an affine transform, the transformation is not exact. In this case, the patches and triangles that constitute the surface after each is subdivided should be small enough that the transform can be approximated by an affine transform over the region containing the control points.
- Parameters:
tform
- a transform to apply to each control point; null for the identity transformlevel
- the number of levels of partitioning (each additional level splits the previous level into quarters)- Returns:
- a surface iterator
-
addCubicPatch
Description copied from class:Surface3D
Add a cubic Bézier patch to this surface, specifying a color and a tag. The control points Pi,j, with i and j in the range [0,3], determine a cubic Bézier patch. The equation
where Bi,3 are Bernstein polynomials of degree 3. The orientation of the patch is determined by the right-hand rule when traversing the edges of the patch so that the (u,v) coordinates lie along a square whose vertices are (0,0), (1,0), (1,1), (0,1), traversed in that order before returning to (0,0). More precisely, at a point (u,v), the direction of the normal to an oriented surface is that of the cross product of a tangent vector at (u, v) in the direction of increasing u with v constant and the tangent vector at (u, v) with constant u.P = ∑i,j Pi,jBi,3(u)Bj,3(v)
The controlPoints array contains 16 control points. The matrix of control points Pij is stored in column-major order with the X, Y, and Z values of a control point listed sequentially. The first 4 control points are also the control points for a cubic Bézier curve that lies along the edge of the patch where v=0; and the last 4 control points are the control points for a Bézier curve that lies along the edge of the patch where v=1. The control points for the Bézier curves along the edges where u=0 and u=1 do not consist of contiguous entries in the controlPoints array.
Methods to help configure the control patches include
Surface3D.setupV0ForPatch(double[],double[],boolean)
.Surface3D.setupV1ForPatch(double[],double[],boolean)
.Surface3D.setupU0ForPatch(double[],double[],boolean)
.Surface3D.setupU1ForPatch(double[],double[],boolean)
.Surface3D.setupRestForPatch(double[])
.Surface3D.setupRestForPatch(double,double,double[],double[],double[],double[],double[])
.
- Specified by:
addCubicPatch
in classSurface3D
- Parameters:
controlPoints
- the control points defining this cubic Bézier patch.color
- the color of this patch; null if none is specifiedtag
- a tag naming this patch; null if there is none
-
addFlippedCubicPatch
Description copied from class:Surface3D
Add a cubic Bézier patch to this surface, specifying a color and a tag, and reversing the patch's orientation. The control points Pi,j, with i and j in the range [0,3], determine a cubic Bézier patch. The equation
where Bi,3 are Bernstein polynomials of degree 3. The orientation of the patch is determined by the right-hand rule when traversing the edges of the patch so that the (u,v) coordinates lie along a square whose vertices are (0,0), (1,0), (1,1), (0,1), traversed in that order before returning to (0,0). More precisely, at a point (u,v), the direction of the normal to an oriented surface is that opposite to the cross product of a tangent vector at (u, v) in the direction of increasing u with v constant and the tangent vector at (u, v) with constant u.P = ∑i,j Pi,jBi,3(u)Bj,3(v)
The controlPoints array contains 16 control points. The matrix of control points Pij is stored in column-major order with the X, Y, and Z values of a control point listed sequentially. The first 4 control points are also the control points for a cubic Bézier curve that lies along the edge of the patch where v=0; and the last 4 control points are the control points for a Bézier curve that lies along the edge of the patch where v=1. The control points for the Bézier curves along the edges where u=0 and u=1 do not consist of contiguous entries in the controlPoints array.
Methods to help configure the control patches include
Surface3D.setupV0ForPatch(double[],double[],boolean)
.Surface3D.setupV1ForPatch(double[],double[],boolean)
.Surface3D.setupU0ForPatch(double[],double[],boolean)
.Surface3D.setupU1ForPatch(double[],double[],boolean)
.Surface3D.setupRestForPatch(double[])
.Surface3D.setupRestForPatch(double,double,double[],double[],double[],double[],double[])
.
For a flipped and non-flipped patch created using the same arguments, a point on the surface at coordinates (v,u) for the flipped patch is the same as the point at coordinates (u,v) for the non-flipped patch.
- Specified by:
addFlippedCubicPatch
in classSurface3D
- Parameters:
controlPoints
- the control points defining this cubic Bézier patch.color
- the color for this patch; null if none is specifiedtag
- a tag naming this patch; null if there is none
-
addCubicTriangle
Description copied from class:Surface3D
Add a cubic Bézier triangle to this surface, specifying a color and a tag. Cubic Bézier triangles uses barycentric coordinates u, v, and w, where u + v + w = 1 and all three coordinates are in the range [0,1].The control points, labeled by their three indices, are located as follows:
The orientation of the triangle is determined by applying the right-hand rule, when traversing the vertices whose (u,v) values are (0,0), (1,0), and (0,1) in that order. More precisely, for an orientated surface at a point (u, v, 1 - u - v), the cross product of a tangent vector in the direction of increasing u with v constant and the tangent vector in the direction of increasing v with u constant points in the direction of a normal to the surface.
The controlPoints array contains the control points whose indices are 003, 012, 021, 030, 102, 111, 120, 201, 210, 300, listed in that order with the X, Y, and Z values for each control point specified as adjacent array entries, again in that order.
If an edge of the segment to be added is a straight line, one should use
Path3D.setupCubic(Point3D,Point3D)
orPath3D.setupCubic(double,double,double,double,double,double)
to obtain the control points that lie along that edge (while contiguous in the array returned by the toCubic method, the locations at which these values should be placed in the controlPoints array may not be contiguous).Several methods exit to help set up the control points. These include
Surface3D.setupU0ForTriangle(double[],double[],boolean)
Surface3D.setupV0ForTriangle(double[],double[],boolean)
Surface3D.setupW0ForTriangle(double[],double[],boolean)
Surface3D.setupU0ForTriangle(double,double,double,double[],double[],boolean)
Surface3D.setupV0ForTriangle(double,double,double,double[],double[],boolean)
Surface3D.setupW0ForTriangle(double,double,double,double[],double[],boolean)
Surface3D.setupCP111ForTriangle(double,double,double,double[])
Surface3D.setupCP111ForTriangle(double,double,double,double[],double,double)
Surface3D.setupCP111ForTriangle(double[])
Surface3D.setupPlanarCP111ForTriangle(double[])
- Specified by:
addCubicTriangle
in classSurface3D
- Parameters:
controlPoints
- the control points for a Bézier trianglecolor
- the color for the triangle; null if none is specifiedtag
- a tag naming this triangle
-
addFlippedCubicTriangle
Description copied from class:Surface3D
Add a cubic Bézier triangle to this surface, specifying a color and a tag, and reversing the triangle's orientation by exchanging its U and V coordinates, Cubic Bézier triangles uses barycentric coordinates u, v, and w, where u + v + w = 1 and all three coordinates are in the range [0,1].Before the orientation is reversed, the control points, labeled by their three indices, are located as follows:
The orientation of the triangle, again before the orientation is reversed, is determined by applying the right-hand rule, when traversing the vertices whose (u,v) values are (0,0), (1,0), and (0,1) in that order. More precisely, for an orientated surface at a point (u, v, 1 - u - v), the cross product of a tangent vector in the direction of increasing u with v constant and the tangent vector in the direction of increasing v with u constant points in the direction opposite to that of a normal to the surface.
The controlPoints array contains the control points whose indices are 003, 012, 021, 030, 102, 111, 120, 201, 210, 300, listed in that order with the X, Y, and Z values for each control point specified as adjacent array entries, again in that order.
If an edge of the segment to be added is a straight line, one should use
Path3D.setupCubic(Point3D,Point3D)
orPath3D.setupCubic(double,double,double,double,double,double)
to obtain the control points that lie along that edge (while contiguous in the array returned by the toCubic method, the locations at which these values should be placed in the controlPoints array may not be contiguous).Several methods exit to help set up the control points. These include
Surface3D.setupU0ForTriangle(double[],double[],boolean)
Surface3D.setupV0ForTriangle(double[],double[],boolean)
Surface3D.setupW0ForTriangle(double[],double[],boolean)
Surface3D.setupU0ForTriangle(double,double,double,double[],double[],boolean)
Surface3D.setupV0ForTriangle(double,double,double,double[],double[],boolean)
Surface3D.setupW0ForTriangle(double,double,double,double[],double[],boolean)
Surface3D.setupCP111ForTriangle(double,double,double,double[])
Surface3D.setupCP111ForTriangle(double,double,double,double[],double,double)
Surface3D.setupCP111ForTriangle(double[])
Surface3D.setupPlanarCP111ForTriangle(double[])
For a flipped and non-flipped triangle created using the same arguments, a point on the surface at coordinates (v,u,w) for the flipped triangle is the same as the point at coordinates (u,v,w) for the non-flipped triangle.
- Specified by:
addFlippedCubicTriangle
in classSurface3D
- Parameters:
controlPoints
- the control points for a Bézier trianglecolor
- the color for the triangle; null if none is specifiedtag
- a tag naming this triangle
-
addPlanarTriangle
Description copied from class:Surface3D
Add a planner triangle to the surface, specifying a control-point array, a color, and a tag. The control points represent three vertices each represented by three array elements for the X, Y, and Z coordinates of the points respectively. The the vertices are numbered so that the right hand rule indicates an outward direction in order to be consistent with the representation used in the org.bzdev.p3d package (which is based on the ordering required in STL files):Points on the triangle can be expressed in barycentric coordinates u, v, and w. These have a constraint u + v + w = 1. By convention, we will use u and v and set w = 1 - (u + v). All three coordinates are restricted to the range [0,1]. In barycentric coordinates, a point p will be located at p = wv1 +uv3 + vv2.
The control-points array stores the vertices in the following order, so as to match the convention for barycentric coordinates used for cubic triangles.
- controlPoints[0], controlPoints[1], controlPoints[2] - the X, Y and Z coordinates respectively for the first vertex.
- controlPoints[3], controlPoints[4], controlPoints[5] - the X, Y and Z coordinates respectively for the third vertex.
- controlPoints[6], controlPoints[7], controlPoints[8] - the X, Y and Z coordinates respectively for the second vertex.
This order matches the ordering used for a cubic Bezier triangle. As a result, applying the right hand rule using the ordering of the control points (v1 to v3 to v3 yields an orientation opposite to that of the triangle. It is not the same as the ordering used for
Surface3D.addPlanarTriangle(double,double,double,double,double,double,double,double,double,Color,Object)
.- Specified by:
addPlanarTriangle
in classSurface3D
- Parameters:
controlPoints
- the vertices of the trianglecolor
- the color of this triangle; null if none is specifiedtag
- a tag naming this triangle; null if there is none
-
addFlippedPlanarTriangle
Description copied from class:Surface3D
Add a planner triangle to the surface, reversing the triangle's orientation by exchanging the triangle's U and V coordinates, and specifying a control-point array, a color, and a tag. The control points represent three vertices each represented by three array elements for the X, Y, and Z coordinates of the points respectively. The the vertices are numbered so that the right hand rule indicates an outward direction in order to be consistent with the representation used in the org.bzdev.p3d package (which is based on the ordering required in STL files):Points on the triangle can be expressed in barycentric coordinates u, v, and w. These have a constraint u + v + w = 1. By convention, we will use u and v and set w = 1 - (u + v). All three coordinates are restricted to the range [0,1]. In barycentric coordinates, a point p will be located at p = wv1 +uv3 + vv2.
Before the triangle's orientation is reversed, the control-points array stores the vertices in the following order so as to match the convention for barycentric coordinates used for cubic triangles:
- controlPoints[0], controlPoints[1], controlPoints[2] - the X, Y and Z coordinates respectively for the first vertex.
- controlPoints[3], controlPoints[4], controlPoints[5] - the X, Y and Z coordinates respectively for the third vertex.
- controlPoints[6], controlPoints[7], controlPoints[8] - the X, Y and Z coordinates respectively for the second vertex.
For a flipped and non-flipped triangle created using the same arguments, a point on the surface at coordinates (v,u,w) for the flipped triangle is the same as the point at coordinates (v,u,w) for the non-flipped triangle.
- Specified by:
addFlippedPlanarTriangle
in classSurface3D
- Parameters:
controlPoints
- the vertices of the trianglecolor
- the color of this triangle; null if none is specifiedtag
- a tag naming this triangle; null if there is none
-
addCubicVertex
Description copied from class:Surface3D
Add a cubic vertex to this surface, specifying a color and tag. A cubic vertex has five control points, P0, P1, P2, P3, and P4. The first four control points are the control points for a cubic Bézier curve and the fifth control point P4 is the control point of a vertex connected points along the Bézier curve by straight lines. The orientation of this surface is that obtained by using the right hand rule when following the Bézier curve from P0 to P3, then proceeding to P4, and finally back to P0. When viewed from the oriented side of the surface, this traversal will go counterclockwise.- Specified by:
addCubicVertex
in classSurface3D
- Parameters:
controlPoints
- the control points, in order, with each represented by three array elements containing a control point's X coordinate, followed by its Y coordinate, followed by its Z coordinatecolor
- the tag of this surface segmenttag
- the tag for this surface segment
-
addFlippedCubicVertex
Description copied from class:Surface3D
Add a flipped cubic vertex to this surface, specifying a color and tag. A cubic vertex has five control points, P0, P1, P2, P3, and P4. The first four control points are the control points for a cubic Bézier curve and the fifth control point P4 is the control point of a vertex connected points along the Bézier curve by straight lines. The orientation of this surface is that obtained by using the right hand rule when following the Bézier curve from P0 to P3, then proceeding to P4, and finally back to P0. When viewed from the oriented side of the surface, this traversal will go clockwise.- Specified by:
addFlippedCubicVertex
in classSurface3D
- Parameters:
controlPoints
- the control points, in order, with each represented by three array elements containing a control point's X coordinate, followed by its Y coordinate, followed by its Z coordinatecolor
- the color of this surface segmenttag
- the tag for this surface segment
-
transform
Description copied from class:Surface3D
Apply a transform to the surface. The transform will be applied to each segment's control points. -
reverseOrientation
public final void reverseOrientation()Description copied from class:Surface3D
Reverse the orientation of this surface. This changes the direction associated with each edge and each segment.- Specified by:
reverseOrientation
in classSurface3D
-
computeBoundary
Description copied from class:Surface3D
Compute the boundary of this surface. This method is public because org.bzdev.p3d.Model3D uses it.The second argument, when true, relaxes some tests for error conditions. Normally this argument should be false. A choice is provided because the Model3D class uses a partial surface where planar triangles are not included. This can result in cases where multiple boundary segments of this partial surface share the same starting points in the partial surface, but not the full surface.
- Specified by:
computeBoundary
in classSurface3D
- Parameters:
out
- an Appendable for logging error messagesmultipleEdges
- true if multiple edges on the boundary can begin at the same vertex; false (the default) otherwise
-