- Find a point
*p*on the surface; - Determine the tangent plane to the surface at
*p*; - Create a disk on the tangent plane at
*p*; - Project a point from the perimeter of the first disk
down to the surface (call the point
*q*); - Determine the tangent plane at
*q*; - Create a second disk on the tangent plane at
*q*; - Intersect the second and first disks;
- Store the intersection points;
- Choose an intersection point,
*u*; - Determine the tangent plane at
*u*; - Create a new disk centered at
*u*; - Intersect the new disk with the previous disks;
- Go to step 8

Step 1, finding a point on the surface, is typically accomplished by using Newton's method to iterate a point in the domain onto the surface.

The steps in which the algorithm determines a tangent plane are
accomplished by determining an orthonormal basis for the kernel of
*Df*. These vectors are tangent to the surface since they are
orthogonal to *Df* (which, for n=1, is just the gradient).

Step 3, creating a disk, is accomplished by using the tangent vectors axes of an ellipse. Two ellipses are intersected by solving a quartic system determined by the equations of two ellipses. So that we have a consistent coordinate system, one of the disks is projected onto the tangent plane of the other.

The version of this algorithm that is implemented in Pisces attempts to intelligently implement this basic strategy by

- Finding special points from which to begin tracing the surface.
(Note: Finding special points is work in progress.)
These special points include
- turning points
- boundary points
- singular points

- Detecting isolated singular points and singular curves on the surface.

**Num_Random_Points***(default value: 1)*-
The number of random points in the domain to use as seeds for Newton's method
in an attempt to iterate onto the surface.
If the iteration onto the surface is successful, the surface point is used
as an initial point for a tangent plane and disk center. Currently, the
algorithm only requires one initial point for connected surfaces. If the
projection fails (ie. a bad random point is selected), no action takes place
and the user needs to press the Go button to execute the algorithm again.
**Num_Uniform_Points***(default value: 0)*-
The number of uniform grid subdivisions in each domain variable. For example,
in a domain R^3, selecting 2 subdivisions produces 2x2x2 = 8 points.
Currently, the grid subdivision is implemented for R^3 and needs to be developed
for R^n.
**Selected_Point***(default value: 0)*-
Set this flag to 1 to force the algorithm to obtain the initial point from
the Model.Domain_Value array which can be set by the user via the Pisces Tcl shell,
or by clicking in a 2D graphics window with the left mouse button.
**Show_Init_Points***(default value: 0)*-
Set this flag to 1 to display all points on the surface that were used
as starting points for the algorithm.
**Show_Surf_Points***(default value: 0)*-
Set this flag to 1 to display all initial points on the surface.
**Show_Surf_Disks***(default value: 1)*-
Set this flag to 1 to display all disk patches (edges only) on the surface.
**Show_Triangulation***(default value: 0)*-
Set this flag to 1 to compute and display a triangulation of the surface.
Currently, the triangulation is updated every time a new disk is added to
the surface.
**Disk_Segments***(default value: 11)*-
The number of line segments used for a polygonal approximation of a disk.
**Disk_rs***(default value: 0.3)*-
Magnitude of the major axis for each elliptical disk.
**Disk_rt***(default value: 0.3)*-
Magnitude of the minor axis for a disk.
**Disk_Max***(default value: 200)*-
Maximum number of disks to compute.

Please send bug reports to
` software@geom.umn.edu.`

For questions about this implementation, contact Frederick J. Wicklin.

Comments to: pisces@geom.umn.edu

Last modified: Tue Jun 4 16:34:59 1996

Copyright © 1995 by The Geometry Center, all rights reserved.