Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.math.mathematica

Topic: Locator-set Bezier curves mapped to 3D surface
Replies: 1   Last Post: Feb 11, 2012 3:44 PM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Christopher O. Young

Posts: 182
Registered: 2/13/11
Locator-set Bezier curves mapped to 3D surface
Posted: Jan 31, 2012 5:35 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

Went back to John Fultz's example mapping a single Bezier curve set via
locators and extended it to map multiple curves at once. Works pretty
fast. I'm still struggling to understand why all these Dynamic wrappers
are necessary, but at least now I've got something to experiment with.

I wish the ImageSize option wasn't so quirky. I couldn't get it to work
until I gave it a list of two coordinates; one number for the size gave
me two differently sized sets of points.

And it still seems to take a lot of work to get PlotStyles to set the
colors for a list of graphs.

http://home.comcast.net/~cy56/Mma/BezCurvesToSaddlePic.png
http://home.comcast.net/~cy56/Mma/BezCurvesToSaddle.nb

Chris Young
cy56@comcast.net

\[HorizontalLine]Saddle = (f \[Function] {f[[1]], f[[2]],
f[[1]] * f[[2]]});

\[HorizontalLine]Bez[P_, t_] :=
Module[
{n = Length[P] - 1},
\!\(
\*UnderoverscriptBox[\(\[Sum]\), \(i = 0\), \(n\)]\(P[[
i + 1]]\ \ BernsteinBasis[n, i, t]\)\)
]

hue[k_, n_] := Hue[Floor[4 (k - 1)/n]/4]

DynamicModule[
{
P, (* all the points *)
\[ScriptCapitalB], (* indexed variable for sets of Bezier
control points *)

nPts, (* number of total points *)
cLnths (* indexed variable for length of each set of control
points *)
},
P = {
{-2, -2}, {-2, -1}, {-2, 1}, {-2, 2},
{-1, -2}, {-1, -1}, {-1, 1}, {-1, 2},
{ 1, -2}, { 1, -1}, { 1, 1}, { 1, 2},
{ 2, -2}, { 2, -1}, { 2, 1}, { 2, 2}
};

\[ScriptCapitalB][k_] :=
If[1 <= k <= 4, Take[P, {(k - 1) 3 + k, (k - 1) 3 + k + 3}]];
nPts = Length[P];
cLnths[k_] := If[1 <= k <= 4, Length[\[ScriptCapitalB][k]]];

{
Dynamic @ LocatorPane[
Dynamic @ P,

Dynamic @ Show[
ParametricPlot @@
{
Table[\[HorizontalLine]Bez[\[ScriptCapitalB][k], t], {k,
4}], {t, 0, 1},
PlotStyle -> Table[Directive[Thick, hue[k, n]], {k, 4}]
},

Graphics[
Table[{Dotted, hue[(k - 1) 4 + k, nPts],
Line[\[ScriptCapitalB][k]]}, {k, 4}]],

Axes -> True,
PlotRange -> 2
],
{{-2, -2}, {2, 2}},

Appearance ->
Table[
Graphics[
{
hue[k, nPts], Disk[{0, 0}],
Gray, Circle[{0, 0}],
Line[{{-1.5, 0}, {1.5, 0}}], Line[{{0, -1.5}, {0, 1.5}}],
Text[k, {0, 0}, {1, 1}]
},
ImageSize -> {18, 18}],
{k, 1, nPts}]
],

Dynamic @ Show[
ParametricPlot3D @@@ {
{\[HorizontalLine]Saddle @ {u, v}, {u, -2, 2}, {v, -2, 2},
PlotStyle -> Opacity[0.5],
Mesh -> False},

{\[HorizontalLine]Saddle /@
Table[ \[HorizontalLine]Bez[\[ScriptCapitalB][k], t], {k,
4}], {t, 0, 1},
PlotStyle -> Table[hue[k, n], {k, 4}]}
} /.
Line[P_, opts___] :> Tube[P, 0.05, opts],

Lighting -> "Neutral",
PlotRange -> {{-2, 2}, {-2, 2}, {-4, 4}},
BoxRatios -> {4, 4, 8}
]
}
]





Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.