Date: Dec 8, 2012 1:28 AM
Author: Bob Hanlon
Subject: Re: tubes program not working in version 9

The code that you posted does not define values for either p0 or q0.
However, even with these defined, I obtained radically different
surfaces depending on whether the intermediate results are simplified.

$Version

"9.0 for Mac OS X x86 (64-bit) (November 20, 2012)"

Clear[p0, q0];

TubePlotFrenet[curve_List, {var_, min_, max_}, radius_, opts___] :=
Module[{tangent, unitTangent, normal, unitNormal, biNormal},
tangent = D[curve, t];
unitTangent = tangent/Sqrt[tangent.tangent];
normal = D[unitTangent, t];
unitNormal = normal/Sqrt[normal.normal];
biNormal = Cross[unitTangent, unitNormal];
ParametricPlot3D[
curve + radius Cos[s] unitNormal + radius Sin[s] biNormal //
Evaluate, {var, min, max}, {s, 0, 2 \[Pi]}, opts]]

TubePlotFrenet2[curve_List, {var_, min_, max_}, radius_, opts___] :=
Module[{tangent, unitTangent, normal, unitNormal, biNormal},
tangent = D[curve, t] // Simplify;
unitTangent = tangent/Sqrt[tangent.tangent] // Simplify;
normal = D[unitTangent, t] // Simplify;
unitNormal = normal/Sqrt[normal.normal] // Simplify;
biNormal = Cross[unitTangent, unitNormal] // Simplify;
ParametricPlot3D[
curve + radius Cos[s] unitNormal + radius Sin[s] biNormal //
Evaluate, {var, min, max}, {s, 0, 2 \[Pi]}, opts]]

Column[Table[With[{p0 = n, q0 = m},
r = Cos[q0*t] + 2;
x = r*Cos[p0*t];
y = r*Sin[p0*t];
z = Sin[q0*t];
w0 = 8*{x, y, z};
Row[{
h1 = TubePlotFrenet[w0, {t, 0, 2 \[Pi]}, 1,
Axes -> None,
Boxed -> False,
PlotPoints -> {64, 16},
ColorFunction -> "CandyColors",
MeshFunctions -> {#3 &},
ImageSize -> 228,
BoxRatios -> {1, 1, 1},
PlotLabel -> StringForm[
"h1: p0 = ``, q0 = ``", p0, q0]],
h2 = TubePlotFrenet2[w0, {t, 0, 2 \[Pi]}, 1,
Axes -> None,
Boxed -> False,
PlotPoints -> {64, 16},
ColorFunction -> "CandyColors",
MeshFunctions -> {#3 &},
ImageSize -> 228,
BoxRatios -> {1, 1, 1},
PlotLabel -> StringForm[
"h2: p0 = ``, q0 = ``", p0, q0]]}]],
{n, {-1, 1}}, {m, {-1, 1}}]]


Bob Hanlon


On Fri, Dec 7, 2012 at 1:39 AM, Roger Bagula <roger.bagula@gmail.com> wrote:
> The problem seems to be sometimes it works but mostly it doesn't.
> The tubes program was written for an earlier version
> ( works in version 5 I think) by Mark McClure
> and has worked fine for literally years.
> I haven't got a clue what has gone wrong.
> ( technically these are called channel surfaces or the like).
>
> TubePlotFrenet[curve_List, {var_, min_, max_}, radius_, opts___] :=
> Module[{tangent, unitTangent, normal, unitNormal, biNormal},
> tangent = D[curve, t];
> unitTangent = tangent/Sqrt[tangent.tangent];
> normal = D[unitTangent, t];
> unitNormal = normal/Sqrt[normal.normal];
> biNormal = Cross[unitTangent, unitNormal];
> ParametricPlot3D[
> curve + radius Cos[s] unitNormal + radius Sin[s] biNormal //
> Evaluate, {var, min, max}, {s, 0, 2 \[Pi]}, opts]]
>
> r = Cos[q0*t] + 2;
> x = r* Cos[p0*t];
> y = r *Sin[p0*t];
> z = Sin[q0*t];
> w0 = 8*{x, y, z}
> h = TubePlotFrenet[w0, {t, 0, 2 \[Pi]}, 1, Axes -> None,
> Boxed -> False, PlotPoints -> {64, 16},
> ColorFunction -> "CandyColors", MeshFunctions -> {#3 &}]
>
> My other tubes program which came from an answer in this group
> still works.
>