The TNB Frame
In 3 dimensional space, the study of curvature begins with the development of the TNB frame. In particular, the plane spanned by the unit vectors T and N is called the osculating plane at that given point on the curve, and the unit binormal B=T x N is a normal vector to the osculating plane.
( commands used to produce the diagram below)
>
jv_curve:=[4*sin(t),4*cos(t),cos(t)^2+sin(Pi*t)+2]:
min_t:=0:
max_t:=5*Pi/6:
num_points:=20:
tdelt:=(max_t-min_t)/num_points:
#Need unit tangent, unit normal, B vector
jv_vec:=diff(jv_curve,t):
jv_tan:=jv_vec/sqrt(innerprod(jv_vec,jv_vec)):
jv_tand:=diff(jv_tan,t):
jv_norm:=jv_tand/sqrt(innerprod(jv_tand,jv_tand)):
jv_bivec:=convert(crossprod(jv_tan,jv_norm),'list'):
# Plot curve first
acurve:=spacecurve(jv_curve,t=min_t..max_t,color=black,thickness=2):
#Construct the Animation of the TNB frame
for i from 0 to num_points do
curr_t:=min_t+i*tdelt:
base_p:=subs(t=curr_t,jv_curve):
curr_tan:=evalf(subs(t=curr_t,jv_tan),5):
curr_norm:=evalf(subs(t=curr_t,jv_norm),5):
curr_bivec:=evalf(subs(t=curr_t,jv_bivec),5):
T_vec:=arrow(base_p,vector(curr_tan),0.1,0.3,0.3,cylindrical_arrow,color=red):
N_vec:=arrow(base_p,vector(curr_norm),0.1,0.3,0.3,cylindrical_arrow,color=green):
B_vec:=arrow(base_p,vector(curr_bivec),0.1,0.3,0.3,cylindrical_arrow,color=blue):
ts:=expand(base_p+1.3*curr_tan):
ns:=expand(base_p+1.3*curr_norm):
bs:=expand(base_p+1.3*curr_bivec):
T_label:=textplot3d([ts[1],ts[2],ts[3],"T"],color=black):
N_label:=textplot3d([ns[1],ns[2],ns[3],"N"],color=black):
B_label:=textplot3d([bs[1],bs[2],bs[3],"B"],color=black):
TN_plane:=polygon([base_p+curr_tan+curr_norm,base_p+curr_tan-curr_norm,
base_p-curr_tan-curr_norm,base_p-curr_tan+curr_norm],color=pink):
ani_vecs[i]:=display(T_vec,N_vec,B_vec,T_label,N_label,B_label,TN_plane):
end do:
TNB:=display(seq(ani_vecs[i],i=0..num_points),insequence=true):
display(acurve,TNB);
>
(select and animate by selecting play in the animation controls)
Thus, if the plane is the same at every point on the curve, then the curve is 2 dimensional and is located in that plane. Let's look at an example.
>
jv_curve:=[2*cos(t), 2*sin(t), t/4/Pi]: #Enter a curve here with t as the parameter
min_t:=0: #enter the low value of the parameter
max_t:=4*Pi: #enter the high value of the parameter
num_points:=20: #enter the number of frames desired
#Need unit tangent, unit normal, B vector
jv_vec:=diff(jv_curve,t):
jv_acc:=diff(jv_vec,t):
jv_tan:=expand(jv_vec/sqrt(innerprod(jv_vec,jv_vec))):
jv_bv:=convert(simplify(crossprod(jv_vec,jv_acc)),'list'):
jv_nm:=convert(simplify(crossprod(jv_bv,jv_vec)),'list'):
jv_bivec:=expand(jv_bv/sqrt(innerprod(jv_bv,jv_bv))):
jv_norm:=expand(jv_nm/sqrt(innerprod(jv_nm,jv_nm)) ):
#jv_tand:=diff(jv_tan,t):
#jv_norm:=expand(jv_tand/sqrt(simplify(innerprod(jv_tand,jv_tand)))):
#jv_bivec:=convert(crossprod(jv_tan,jv_norm),'list'):
#Plot Curve First
tdelt:=evalf((max_t-min_t)/num_points,10):
acurve:=spacecurve(jv_curve,t=min_t..max_t,color=black,thickness=2):
#Construct Animation Next
for i from 0 to num_points do
curr_t:=min_t+i*tdelt:
base_p:=subs(t=curr_t,jv_curve):
if simplify(subs(t=curr_t,innerprod(jv_vec,jv_vec)))>0 then
curr_tan:=evalf(subs(t=curr_t,jv_tan),5):
curr_norm:=evalf(subs(t=curr_t,jv_norm),5):
curr_bivec:=evalf(expand(subs(t=curr_t,jv_bivec)),5):
T_vec:=line(base_p,expand(base_p+curr_tan),color=red,thickness=2):
N_vec:=line(base_p,expand(base_p+curr_norm),color=green,thickness=2):
B_vec:=line(base_p,expand(base_p+curr_bivec),color=blue,thickness=2):
ts:=expand(base_p+1.3*curr_tan):
ns:=expand(base_p+1.3*curr_norm):
bs:=expand(base_p+1.3*curr_bivec):
T_label:=textplot3d([ts[1],ts[2],ts[3],"T"],color=black):
N_label:=textplot3d([ns[1],ns[2],ns[3],"N"],color=black):
B_label:=textplot3d([bs[1],bs[2],bs[3],"B"],color=black):
TN_plane:=polygon([base_p+curr_tan+curr_norm,base_p+curr_tan-curr_norm,
base_p-curr_tan-curr_norm,base_p-curr_tan+curr_norm],color=pink):
ani_vecs[i]:=display(T_vec,N_vec,B_vec,T_label,N_label,B_label,TN_plane):
else #if Speed is 0, then Animation does not "move"
ani_vecs[i]:=ani_vecs[i-1]:
end if:
end do:
ani_plot:=display(seq(ani_vecs[i],i=0..num_points),insequence=true):
display(acurve,ani_plot,scaling=constrained);
#Click and animate by selecting play in animation controls