TransWikia.com

Intersection of a sphere and a plane knowing equations

TeX - LaTeX Asked on February 20, 2021

I am trying draw a circle is intersection of a plane has equation 2 x − 2 y + z − 15 = 0 and the equation of the sphere is ( x − 1)^2 + ( y + 1)^ 2 + ( z − 2)^ 2 − 25 = 0.
enter image description here

The plane cut the sphere is a circle with centre (3,-3,3 and radius r = 4.

I can’t draw the circle. I tried

documentclass[12pt,border = 2 mm]{standalone}
usepackage{tikz}
usepackage{tikz-3dplot}
usetikzlibrary{arrows,calc,backgrounds}
begin{document}
tdplotsetmaincoords{60}{110}
begin{tikzpicture}[tdplot_main_coords]
path
      coordinate (T) at (3,-3,3)
      coordinate (I) at (1,-1,2);

foreach v/position in {T/above,I/below} {
    draw[fill=black] (v) circle (0.7pt) node [position=0.2mm] {$v$};
}

draw[dashed] (T) circle[radius={4}];

begin{scope}[tdplot_screen_coords, on background layer]
  pgfmathsetmacro{R}{5}%
  fill[ball color=purple, opacity=1.0] (I) circle (R); 
end{scope}
end{tikzpicture}
end{document} 

enter image description here

How can I draw the circle?

4 Answers

We know the normal n of the plane and the radius of the circle. Call two vectors that are orthogonal to n and orthogonal to each other u and v. Then the circle is given by

 gamma(t) = I + n + r * cos(t) * u + r* sin(t) * v,

where n fulfills the length constraint n^2+r^2=R^2, where R is the radius of the sphere and r the radius of the circle. Your vector n satisfies this constraint already, so we do not have to change its normalization.

Now we need to figure out what the visible and invisible stretches are. Any point on the sphere has either a positive or negative projection on the normal vector on the screen

n_screen =({sin(tdplotmaintheta)*sin(tdplotmainphi)},{-sin(tdplotmaintheta)*cos(tdplotmainphi)},{cos(tdplotmaintheta)});

So we need to find the zeros of the projection gamma(t).n_screen. This can be accomplished by letting TikZ find the intersections. Of course we do not really draw the paths here, and use overlay for them not to screw up the bounding box. Notice that the current version assumes that there are two zeros, so if you drastically change the view angles, this version won't work any more.

documentclass[12pt,border=2mm,tikz]{standalone}
usepackage{tikz-3dplot}
usetikzlibrary{arrows,calc,backgrounds,intersections}
begin{document}
tdplotsetmaincoords{60}{110}
begin{tikzpicture}[tdplot_main_coords,
declare function={dicri(t,th,ph,R)=
sin(th)*sin(ph)*(2+R*cos(t)*1/sqrt(2)+R*sin(t)*1/sqrt(18))-
sin(th)*cos(ph)*(-2+R*cos(t)*1/sqrt(2)-R*sin(t)*1/sqrt(18))+
cos(th)*(1-4*R*sin(t)*1/sqrt(18));}]
path
      coordinate (T) at (3,-3,3)
      coordinate (I) at (1,-1,2)
      coordinate (n) at (2,-2,1)
      coordinate (u) at ({1/sqrt(2)},{1/sqrt(2)},0)
      coordinate (v) at ({1/sqrt(18)},{-1/sqrt(18)},{-4/sqrt(18)});
      % the coordinatesn, u and v are not really used here

foreach v/position in {T/above,I/below} {
    draw[fill=black] (v) circle (0.7pt) node [position=0.2mm] {$v$};
}
% draw[red,thick,-latex] (0,0,0) --
% ({sin(tdplotmaintheta)*sin(tdplotmainphi)},
% {-sin(tdplotmaintheta)*cos(tdplotmainphi)},{cos(tdplotmaintheta)});
% normal to screen
begin{scope}[tdplot_screen_coords, on background layer]
  pgfmathsetmacro{R}{5}%
  fill[ball color=purple, opacity=1.0] (I) circle (R);
  % determine the zeros of dicri
  path[overlay,name path=dicri] plot[variable=x,domain=0:360,samples=73]
  ({x*1pt},{dicri(x,tdplotmaintheta,tdplotmainphi,4)});
  path[overlay,name path=zero] (0,0) -- (360pt,0);
  path[name intersections={of=dicri and zero,total=t}]
  let p1=(intersection-1),p2=(intersection-2) in
  pgfextra{xdefxmin{x1}xdefxmax{x2}};
end{scope}
pgfmathsetmacro{R}{4}
draw[dashed] plot[variable=t,domain=xmin:xmax,samples=73,smooth] 
 ({1+2+R*cos(t)*1/sqrt(2)+R*sin(t)*1/sqrt(18)},
 {-1-2+R*cos(t)*1/sqrt(2)-R*sin(t)*1/sqrt(18)},
 {2+1-4*R*sin(t)*1/sqrt(18)});
draw[thick] plot[variable=t,domain=xmax:xmin+360,samples=73,smooth] 
 ({1+2+R*cos(t)*1/sqrt(2)+R*sin(t)*1/sqrt(18)},
 {-1-2+R*cos(t)*1/sqrt(2)-R*sin(t)*1/sqrt(18)},
 {2+1-4*R*sin(t)*1/sqrt(18)});
end{tikzpicture}
end{document}

enter image description here

And here is a plane, using your nicer vectors u and v from the chat.

documentclass[12pt,border=2mm,tikz]{standalone} 
usepackage{tikz-3dplot} 
usetikzlibrary{arrows,calc,backgrounds,intersections} 
makeatletter % https://tex.stackexchange.com/a/38995/121799
tikzset{
  use path/.code={pgfsyssoftpath@setcurrentpath{#1}}
}
makeatother
begin{document} 
tdplotsetmaincoords{60}{110} 
begin{tikzpicture}[tdplot_main_coords, 
  declare function={dicri(t,th,ph,R)=% 
  sin(th)*sin(ph)*(2+R*cos(t)/3+2*R*sin(t)/3)-%
  sin(th)*cos(ph)*(-2 +2*R*cos(t)/3 + R*sin(t)/3)+%
  cos(th)*(1+2*R*cos(t)/3-2*R*sin(t)/3);}] 
  pgfmathsetmacro{R}{5}% 
  path  coordinate (T) at (3,-3,3) 
   coordinate (I) at (1,-1,2) 
   coordinate (n) at (2,-2,1) 
   coordinate (u) at (1, 2, 2) 
   coordinate (v) at (2, 1, -2); 
  % the coordinatesn, u and v are not really used here 
   path[tdplot_screen_coords,shift={(I)},use as bounding box] (-1.2*R,-1.2*R)rectangle (1.2*R,1.2*R);   

  foreach v/position in {T/above,I/below} { 
   draw[fill=black] (v) circle (0.7pt) node [position=0.2mm] {$v$}; 
  } 
  % draw[red,thick,-latex] (0,0,0) -- 
  % ({sin(tdplotmaintheta)*sin(tdplotmainphi)}, 
  % {-sin(tdplotmaintheta)*cos(tdplotmainphi)},{cos(tdplotmaintheta)}); 
  % normal to screen 
  begin{scope}[tdplot_screen_coords, on background layer] 
   fill[ball color=green, opacity=0.8] (I) circle (R); 
   % determine the zeros of dicri 
   path[overlay,name path=dicri] plot[variable=x,domain=0:360,samples=73] 
   ({x*1pt},{dicri(x,tdplotmaintheta,tdplotmainphi,4)}); 
   path[overlay,name path=zero] (0,0) -- (360pt,0); 
   path[name intersections={of=dicri and zero,total=t}] 
   let p1=(intersection-1),p2=(intersection-2) in 
   pgfextra{xdeftmin{x1}xdeftmax{x2}}; 
  end{scope} 
  pgfmathsetmacro{SmallR}{4} 
  draw[dashed] plot[variable=t,domain=tmin:tmax,samples=50,smooth] 
   ({1+2+SmallR*cos(t)/3+2*SmallR*sin(t)/3}, 
   {-1-2 +2*SmallR*cos(t)/3+ SmallR*sin(t)/3}, 
   {2+1+2*SmallR*cos(t)/3 - 2*SmallR*sin(t)/3 }); 
  draw[thick,save path=pathA] plot[variable=t,domain=tmax:tmin+360,samples=50,smooth] 
   ({1+2+SmallR*cos(t)/3+2*SmallR*sin(t)/3}, 
   {-1-2 +2*SmallR*cos(t)/3+ SmallR*sin(t)/3}, 
   {2+1+2*SmallR*cos(t)/3 - 2*SmallR*sin(t)/3 }); 
  path ({1+2+SmallR*cos(tmin)/3+2*SmallR*sin(tmin)/3}, 
   {-1-2 +2*SmallR*cos(tmin)/3+ SmallR*sin(tmin)/3}, 
   {2+1+2*SmallR*cos(tmin)/3 - 2*SmallR*sin(tmin)/3 }) coordinate (pmin)
   ({1+2+SmallR*cos(tmax)/3+2*SmallR*sin(tmax)/3}, 
   {-1-2 +2*SmallR*cos(tmax)/3+ SmallR*sin(tmax)/3}, 
   {2+1+2*SmallR*cos(tmax)/3 - 2*SmallR*sin(tmax)/3 }) coordinate (pmax);
  begin{scope}[tdplot_screen_coords]
   clip[shift={(I)}] (-1.2*R,-1.2*R)rectangle (1.2*R,1.2*R);   
   path[fill=gray,fill opacity=0.4,even odd rule] let p1=($(pmin)-(I)$),p2=($(pmax)-(I)$),
   p3=($(pmax)-(pmin)$),n1={atan2(y1,x1)},n2={atan2(y2,x2)},
   n3={atan2(y3,x3)}
    in [use path=pathA]  (pmin) arc(n1:n2-360:R) 
    (0,-6) -- ++(n3:{12cm/sin(n3)}) -- ++(n3+90:{12cm/sin(n3)})
    -- ++(n3+180:{12cm/sin(n3)}) -- cycle;
  end{scope}
end{tikzpicture} 
end{document}

enter image description here

Correct answer by user121799 on February 20, 2021

I add this because you asked me to use the 3d circle through 3 points pic here. It can be used after we have three points. These points can be constructed by adding vectors of length 4, the radius, to T which lie in the plane of the circle. These vectors are taken from the other answer, and rescaled.

documentclass[12pt,tikz,border=2 mm]{standalone}
usepackage{tikz-3dplot}
usetikzlibrary{3dtools,backgrounds}
begin{document}
tdplotsetmaincoords{60}{110}
begin{tikzpicture}[tdplot_main_coords]
pgfmathsetmacro{mysq}{4/3}
path   (3,-3,3) coordinate (T)
      (1,-1,2) coordinate (I) 
      (1, 2, 2) coordinate (u)  
      (2, 1, -2) coordinate (v)
      [3d coordinate={(A)=(T)+mysq*(u)}]
      [3d coordinate={(B)=(T)+mysq*(v)}]
      [3d coordinate={(C)=(T)-mysq*(u)}];

foreach v/position in {T/above,I/below} {
    draw[fill=black] (v) circle (0.7pt) node [position=0.2mm] {$v$};
}

path[dashed] pic{3d circle through 3 points={A={(A)},B={(B)},C={(C)}}};

begin{scope}[tdplot_screen_coords, on background layer]
  pgfmathsetmacro{R}{5}%
  fill[ball color=purple, opacity=1.0] (I) circle (R); 
end{scope}
end{tikzpicture}
end{document} 

enter image description here

Answered by user194703 on February 20, 2021

Many thanks to Schrödinger's cat about 3dtools. In this answer, I use Mathematica to find coordinates of three points A, B, C and draw circle (ABC). I use tikz-3dplot-circleofsphere at here to draw style of line of the circle (ABC).

documentclass[12pt,tikz,border=2 mm]{standalone}
usepackage{tikz-3dplot-circleofsphere}
usetikzlibrary{3dtools}
begin{document}
    tdplotsetmaincoords{60}{110}
begin{tikzpicture}[scale=1,tdplot_main_coords,declare function={R=5;
}]
    path   (3,-3,3) coordinate (T)
    (1,-1,2) coordinate (I) 
    (1, {1/5 *(-23 - 2* sqrt(11))}, {1/5 *(19 - 4 *sqrt(11))}) coordinate (A)
    (1, {1/5 *(-23 + 2* sqrt(11))}, {1/5 *(19 + 4 *sqrt(11))}) coordinate (B)
    ({1/4* (13 + sqrt(119))}, {1/4 *(-13 + sqrt(119))}, 2) coordinate (C);
begin{scope}[tdplot_screen_coords] 
fill[ball color=green, opacity=0.8] (I) circle (R);
    end{scope}
begin{scope}[shift={(I)}]
path[overlay] [3d coordinate={(A-B)=(A)-(B)},
3d coordinate={(A-C)=(A)-(C)},
3d coordinate={(myn)=(A-B)x(A-C)},
3d coordinate={(A-T)=(A)-(T)}];
pgfmathsetmacro{myaxisangles}{axisangles("(myn)")}
pgfmathsetmacro{myalpha}{{myaxisangles}[0]}
pgfmathsetmacro{mybeta}{{myaxisangles}[1]}
pgfmathsetmacro{mygamma}{-acos(sqrt(TD("(A-T)o(A-T)"))/R)}
tdplotCsDrawCircle[tdplotCsFront/.style={thick}]{R}{myalpha}{mybeta}{mygamma} 
end{scope} 

foreach p in {I,T,B}
draw[fill=black] (p) circle (1.5 pt);
foreach p/g in {I/0,T/-90,B/30}
path (p)+(g:3mm) node{$p$};
draw[dashed] (I) -- (T) -- (B) -- cycle;
    end{tikzpicture}
end{document} 

enter image description here

Answered by minhthien_2016 on February 20, 2021

As an alternative, Asymptote version:

// spherexplane.asy
//
// run 
//   asy -f pdf -render=4 -noprc spherexplane.asy
// to get a standalone raster spherexplane.pdf
//
import solids;
size(8cm); size3(100,100);
currentprojection=orthographic(camera=(66,40,-9),zoom=0.9);
currentlight=Headlamp;

pen linePen=darkblue+1.3bp;
pen dotPen= darkblue+3bp;
pen dashPen=1bp+linetype(new real[]{4,3})+linecap(0);

// Eqn of the sphere (x - 1)^2 + (y + 1)^ 2 + (z - 2)^ 2 - 25 = 0
triple O=(1,-1,2);
real R=5;

// Eqn of the plane  2 x - 2 y + z - 15 = 0
triple fp(real x, real y){return (x,y,- 2 x + 2 y + 15);}

triple Np=unit((2,-2,1)); // plane normal
triple A=fp(0,0);  // any point on the plane
triple C=O+dot(A-O,Np)*Np; // center of the circle cross section

real d=abs(C-O);
real r=sqrt(R^2-d^2);

guide3 baseArc=Arc(O,O+Np*R,O-Np*R,normal=cross(Z,Np));
revolution b=revolution(O,baseArc,axis=Np); // spherical surface
skeleton s;
real t=acos(d/R)/pi; // fraction of the arc length at the cutting point
b.transverse(s,reltime(b.g,t),P=currentprojection);
guide3 circCut=s.transverse.back[0] & s.transverse.front[0] & cycle;

triple D=relpoint(circCut,0.6);

draw(surface(b),paleblue+opacity(0.3));
draw(surface(circCut),orange+opacity(0.3));

draw(s.transverse.front,linePen);
draw(s.transverse.back, dashPen);

draw(O--C--D, dashPen);

dot("$O$",O,dotPen);
dot(Label("$C$",unit(C-O)),C,dotPen);
dot("$D$",D,dotPen);

xaxis3(xmin=0,xmax=1,red,above=true);
yaxis3(ymin=0,ymax=1,deepgreen,above=true);
zaxis3(zmin=0,zmax=1,blue,above=true);

enter image description here

Answered by g.kov on February 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP