Use CMake to generate installation package.

CMake/CPack can be used to generate an installation file.  Now the
'make package' command will automatically generate a *.zip file for
distribution.

CMake will insert the VSP version number and build date into a generated
main.h file, so the src/CMakeLists.txt file is now the master source of
the version number.
Make MS_Wing components scale by linear dimension instead of area.

Restore the old behavior where scaling was by linear dimension instead
of area.
Change the old strake-wing to scale by linear dimension instead of area.

Change strake-wing component scaling to be by linear dimension instead
of area for consistency with other VSP components.

Because strake-wing components are now converted to MS_Wing components
when they are read in, it is unlikely that this code is ever called.
Remove unused bicubic_surf class.

bicubic_surf.h was included a few places, but only bezier_surf.cpp used
any of the class (bezier_surf::load_bicubic) -- which was never called.

This removes load_bicubic from bezier_surf and also bicubic_surf.
Remove redundant parameter to SplitEdge.

Mesh::SplitEdge was only called from one place -- itself.  It was passed
a pointer to a surface - which was already present in the object.
Removing the parameter cleans up the logic and will prevent anyone from
trying to call SplitEdge with a different Surf*.
Introduce Surf::BlendDerivFuncs and use it.

Also use BlendFunds in more places rather than repeating the code.
Introduce CompTan functions which work on full-range parameters.

This changes the CompTanX01 to be wrappers around the full-range
implementation like CompPnt vs. CompPnt01.
Introduce functions for calculating second derivatives of Bezier surface.

A second-derivative blend function is introduced as are Bezier surface
evaluators which utilize it.
Introduce CompBez as common Bezier surface computation function.

Bezier surface position, derivative, and second derivative calculation
follows the same procedure, changing only the Bezier blend function
required.

This change uses function pointers to the blend functions to use a
single implementation for all of the Bezier surface calculations.
Remove unused TesselateCurves method from Surf.
Remove always false ICurve.m_FlipDirFlag.

This bool was only ever set to false.  Removing the possibility for matched
intersection curves to be flipped will simplify the logic for the
curvature based tessellation along the curves.
Introduce Surf::CompCurvature to calculate surface curvature metrics.

CompCurvature calculates the principal curvatures (k1, k2), the mean
curvature (ka), and the Gaussian curvature (kg) at a point on the surface.
Extrapolate Bezier surface when at or beyond maximum parameter.

Rather than force the value of the final control point, use the blend
functions to perform the Bezier surface calculations at or beyond the
maximum parameter value.

This change ensures the derivative calculations are correct up to the
edge of the surface.  The previous code would result in the control point
value for all derivatives at the surface limit.

The Bezier calculation should be reasonably well behaved for small
extrapolations.
Introduce Surf::TargetLen to calculate curvature based target mesh length.

Calculate the edge length which will result in a specified gap between
the edge midpoint and the surface.

This uses the larger magnitude principal curvature (k1) to ensure the
locally worst-case situation is handled.  The radius of curvature is
calculated r=1/k.  The local edge length is calculated which will give
the desired gap for the radius.

When the gap is larger than the radius, the target edge length is twice
the gap.

The flat surface case is handled through the large default value for len
and the check for small k1 -- if( fabs(k1) > tol ).

The curvature calculation returns NAN when both parameters are at their
maximum values.  i.e. in one corner of the surface.  This case is trapped
and the curvature values just inside the corner are calcualted instead.
Scurve::Tesselate intersection curve checking curvature of both surfaces.

Check curvature of both surfaces to set target length along intersection
cuve.

Gap setting hard-coded to 0.0025 for now.
Use curvature when calculating target edge length along curve.

This version of Tesselate will be used for curves which border only one
surface.  This is the case for open bodies.

Gap hard coded at 0.0025.
Use two-surface curve tesselator.

Change calls to curve tesselator to use two-surface version.  This
requires moving the call as appropriate.
Use curvature based target edge length for main mesh field (not edges).

Gap is hard coded to 0.0025.
Introduce minimum edge length.

Some of the curvature based meshing calculations result in very small
edge lengths, which cause their own problems.  Introducing a minimum
target edge length should provide control of this situation.
Curvature meshing calculated on number of segments to represent a circle.

The number of segments required to represent a circle of a certain radius
determines the length of that segment.  In fact, for a given number of
segments, the segment length is a fixed fraction of the radius.

This code causes target edge length to be calculated as a desired fraction
of the local radius of curvature.  In this change, that fraction is hard
coded to 0.0981.  The formula for calculating this fraction is:

radfrac = 2.0 * sin(pi/N)

Where N is the number of segments desired to represent a circle. Using
N=64 results in radfrac=0.0981.