interc[c_,a_,b_,t_]:=Which[a≤t≤b,c[t],t<a,c[a],b<t,c[b]];
intertangentc[c_,a_,b_,t_]:=Which[a≤t≤b,c'[t],t<a,c'[a],b<t,c'[b]];
trac[c_,a_,b_,oppt___]:=ParametricPlot[c[t],{t,a,b},PlotRange->(PlotRange/.{oppt})];
tracp[c_,a_,b_,t_,oppt___]:=Which[
a==t,
Graphics[{Point[c[a]]}],
a<t≤b,
ParametricPlot[c[s],{s,a,t},PlotRange->(PlotRange/.{oppt})],
b<t,
ParametricPlot[c[s],{s,a,b},PlotRange->(PlotRange/.{oppt})]
];
tracpp[c_,a_,b_,t_,oppt___]:=Block[{default,Vector,Point},
default={Vector->False,Point->True};
opptgraph=Select[{oppt},!MemberQ[#[[1]]&/@default,#[[1]]]&];
default=Join[{oppt},Select[default,!MemberQ[#[[1]]&/@{oppt},#[[1]]]&]];
Show[
Join[
{tracp[c,a,b,t,Sequence@@opptgraph]},
If[Point/.default,{Graphics[{PointSize[.02],Point[interc[c,a,b,t]]}]},{}],
If[Vector/.default,{Graphics[{Arrow[{interc[c,a,b,t],interc[c,a,b,t]+intertangentc[c,a,b,t]}]}]},{}]
],
Sequence@@opptgraph]
];

interc3D[c_,a_,b_,t_]:=Which[a≤t≤b,c[t],t<a,c[a],b<t,c[b]];
trac3D[c_,a_,b_,oppt___]:=ParametricPlot3D[c[t],{t,a,b},PlotRange->(PlotRange/.{oppt})];
tracp3D[c_,a_,b_,t_,oppt___]:=Which[
a==t,
Graphics3D[{Point[c[a]]}],
a<t≤b,
ParametricPlot3D[c[s],{s,a,t},PlotRange->(PlotRange/.{oppt})],
b<t,
ParametricPlot3D[c[s],{s,a,b},PlotRange->(PlotRange/.{oppt})]
];
tracpp3D[c_,a_,b_,t_,oppt___]:=Show[{
tracp3D[c,a,b,t,oppt],
Graphics3D[{PointSize[.02],Point[interc3D[c,a,b,t]]}]
},
oppt];

c[t_]:=Cos[2t]{Cos[t],Sin[t]};
c1[t_]:=c[-t];
a=0;b=2π;
a1=0;b1=2π;
np=80;
xi=-2;xf=2;yi=-2;yf=2;
Animate[
GraphicsGrid[{{
tracpp[c,a,b,t,Axes->True,AxesOrigin->{0,0},PlotRange->{{xi,xf},{yi,yf}},ImageSize->Medium,Vector->True]
,
tracpp[c1,a1,b1,t,Axes->True,AxesOrigin->{0,0},PlotRange->{{xi,xf},{yi,yf}},ImageSize->Medium,Vector->True]
}}]
,
{t,a,b,((b-a)/np)}]

ContourPlot[((((x^2)+(y^2)))^3)==((((x^2)-(y^2)))^2),{x,-1,1},{y,-1,1},PlotPoints->100]

c[t_]:={Cos[2t]Cos[t]Cos[t],Cos[2t]Cos[t]Sin[t],Cos[2t]Sin[t]};
c1[t_]:=c[(t^2)];
a=0;b=2π;
a1=0;b1=(((2π))^(1/2));
np=100;
xi=-2;xf=2;yi=-2;yf=2;zi=-2;zf=2;
Animate[
GraphicsGrid[{{
tracpp3D[c,a,b,t,Axes->True,AxesOrigin->{0,0,0},Boxed->False,PlotRange->{{xi,xf},{yi,yf},{zi,zf}},ImageSize->Full]
}}]
,
{t,a,b,((b-a)/np)}]

trac3D[c,a,b,PlotRange->All]

c[t_]:={Cos[t],Sin[t],(1/2)t};
a=0;b=4π;
a1=0;b1=(((2π))^(1/2));
np=100;
xi=-2;xf=2;yi=-2;yf=2;zi=0;zf=7;
Animate[
GraphicsGrid[{{
tracpp3D[c,a,b,t,Axes->True,AxesOrigin->{0,0,0},Boxed->False,PlotRange->{{xi,xf},{yi,yf},{zi,zf}},ImageSize->Full,ViewPoint->{1.3, -2.4, 2.}]
}}]
,
{t,a,b,((b-a)/np)}]

g1=ContourPlot3D[{(x^2)+(y^2)==4y,(x^2)+(y^2)+(z^2)==16},{x,-5,5},{y,-5,5},{z,-5,5},Boxed->False,AxesOrigin->{0,0,0}]

g2=ParametricPlot3D[{2Cos[t],2+2Sin[t],2(Sqrt[2-2Sin[t]])},{t,0,2π},PlotStyle->Red]

Show[{g1,g2}]