Re: Uniform arc length basis curve fitting
- To: mathgroup at smc.vnet.net
- Subject: [mg67452] Re: Uniform arc length basis curve fitting
- From: "Dana DeLouis" <ddelouis at bellsouth.net>
- Date: Sun, 25 Jun 2006 03:19:20 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi. I do not know if this will help, but here is a general discussion of
finding the arc length of the Cubic Spline example.
Needs["NumericalMath`SplineFit`", "Graphics`Spline`"]
pts = {{0, 0}, {1, 2}, {-1, 3}, {0, 1}, {3, 0}};
Show[Graphics[Spline[pts, Cubic, SplineDots -> Automatic],
GridLines -> {{-1, 0, 1, 2, 3}, {0, 1, 2, 3}}], Axes -> True];
With 5 points, there are 4 intervals as observed in the above graph.
A Spline generates a cubic equation for each of the 4 intervals, numbered 0,
1, 2 & 3.
Here's that Spline Function...
sf = SplineFit[pts, Cubic];
The variables for the cubic Polynomials are the last item (4th) in the
SplineFuntion object.
sf[[4]] or Last[sf]
The valid range of the Spline Function is the Second item... sf[[2]]
Here's a function to put the Spline variables into a better form. I will
use the variable 't'.
SplineEquations[sf_SplineFunction, v_Symbol:t] :=
Module[{m = Last[sf]}, (#1 . {1, v, v^2, v^3} & ) /@ m]
Here's a list of all the Spline Equations:
se = SplineEquations[sf]
TableForm[se, TableHeadings -> {{0, 1, 2, 3}, {"X", "Y"}}]
When you do a plot of a Spline from 0 to 4, the integer portion of the
number picks which equation to use,
and the fractional part, which runs from 0 to 1, is used to determine the x
& y points.
For example, a number like 0.5 is taken to mean the following...The 0 is
used to select the first equation, and the 0.5 is used as 't above to
determine the x & y points.
A number like 1.7 is taken to mean "use the second equation, and use 0.7 to
determine the x & y points.
The number '4 in the valid range is a little different...it just means use
equation #3 (the 4th one), but use a value of '1 to determine x & y. (At the
end of the interval).
We just note item #12 in the following link:
http://mathworld.wolfram.com/ArcLength.html
Here's a function to return the Arc Length equations:
ArcLengthEquation[{x_, y_}, v_Symbol] :=
Module[{equ}, equ = Norm[D[{x, y}, v]];
Assuming[0 <= v <= 1, Simplify[equ]]]
Here's the Arc Length equation of the second interval...
ArcLengthEquation[se[[2]], t]
(3/56)*Sqrt[1620 + 3672*t + 4952*t^2 - 23172*t^3 + 13565*t^4]
The actual Arc Length is calculated from 0 to 1. We note here that the
symbolic integral is rather difficult, so that makes calculating x/y points
from a given length rather hard.
ArcLength[{x_, y_}, v_Symbol] :=
Module[{equ}, equ = ArcLengthEquation[{x, y}, v]; NIntegrate[equ, {v, 0,
1}]]
We Map it onto each of the 4 parametric equations to get each Arc Length:
(ArcLength[#1, t] & ) /@ se
{2.381081440098988, 2.3750200913641875, 2.4204208569360257,
3.1974584672827886}
The total length of the graph is:
Total[%]
10.373980855681989
I hope this helps in some way.
Dana DeLouis
Mathematica 5.2 for Windows