Moebius strips
- To: mathgroup at smc.vnet.net
- Subject: [mg6543] Moebius strips
- From: wself at viking.emcmt.edu (Will Self)
- Date: Mon, 31 Mar 1997 23:01:42 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Arturus asked for code for a nice Moebius strip. With this function you can have it all: nice Moebius strips and ones that are not so nice. If you have any curve in 3-space given as {f[t],g[t],h[t]}, this function will give you a strip whose centerline is your curve. You can give an integer value for the argument twist, which will control the number of times the strip twists around. --------------------------------- norm[v_]:=Sqrt[v.v] cross[{a_,b_,c_},{d_,e_,f_}]:={b f - c e, c d - a f, a e - b d} perp[v_, unitVec_]:= v - (v . unitVec) unitVec normalizedPerp[v_, w_]:= perp[v, w]/norm[perp[v, w]] moebiusStrip[{f_,g_,h_},{s_,begin_,end_}, width_,twist_,options___]:= Module[{positionVector, velocityVector, unitTangentVector, accelerationVector, normalVector, binormalVector, twist2=twist Pi/(end-begin)}, positionVector[t_]={f,g,h}/.s->t; velocityVector[t_]=Derivative[1][positionVector][t]; unitTangentVector[t_]=velocityVector[t]/norm[velocityVector[t]]; accelerationVector[t_]=Derivative[2][positionVector][t]; normalVector[t_]=normalizedPerp[accelerationVector[t],unitTangentVector[t]]; binormalVector[t_]=cross[unitTangentVector[t],normalVector[t]]; ParametricPlot3D[positionVector[w]+ u*Cos[twist2 w]*normalVector[w]+ u*Sin[twist2 w]*binormalVector[w], {w, begin, end}, {u, -width, width}, Compiled -> False, PlotPoints->{36,2}, options]] --------------------------------- You may want to increase the 36 in the PlotPoints option. The function as written is *anything but* optimized for speed. On the other hand, I think it provides an excellent example of how you can often write Mathematica code that is a close reflection of the mathematics you are doing. Example: moebiusStrip[{Cos[t], Sin[t],.3Cos[t]}, {t, 0, 2 Pi}, 0.2, 2] Will Self Montana State University, Billings MT