Saltar al contenido

Intersección de una esfera y un plano conociendo ecuaciones

Solución:

Conocemos lo normal n del plano y el radio del círculo. Llame a dos vectores que son ortogonales a n y ortogonales entre sí u y v. Entonces el círculo está dado por

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

dónde n cumple la restricción de longitud n^2+r^2=R^2, dónde R es el radio de la esfera y r el radio del círculo. Tu vector n ya satisface esta restricción, por lo que no tenemos que cambiar su normalización.

Ahora tenemos que averiguar cuáles son los tramos visibles e invisibles. Cualquier punto de la esfera tiene una proyección positiva o negativa en el vector normal de la pantalla.

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

Entonces necesitamos encontrar los ceros de la proyección. gamma(t).n_screen. Esto se puede lograr dejando que TikZ encuentra las intersecciones. Por supuesto, no dibujamos realmente los caminos aquí, y usamos overlay para que no arruinen el cuadro delimitador. Tenga en cuenta que la versión actual asume que hay dos ceros, por lo que si cambia drásticamente los ángulos de visión, esta versión ya no funcionará.

documentclass[12pt,border=2mm,tikz]standalone
usepackagetikz-3dplot
usetikzlibraryarrows,calc,backgrounds,intersections
begindocument
tdplotsetmaincoords60110
begintikzpicture[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
beginscope[tdplot_screen_coords, on background layer]
  pgfmathsetmacroR5%
  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
  pgfextraxdefxminx1xdefxmaxx2;
endscope
pgfmathsetmacroR4
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));
endtikzpicture
enddocument

ingrese la descripción de la imagen aquí

Y aquí hay un avión, usando tus mejores vectores. u y v desde el chat.

documentclass[12pt,border=2mm,tikz]standalone 
usepackagetikz-3dplot 
usetikzlibraryarrows,calc,backgrounds,intersections 
makeatletter % https://tex.stackexchange.com/a/38995/121799
tikzset
  use path/.code=[email protected]
#1 makeatother begindocument tdplotsetmaincoords60110 begintikzpicture[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);] pgfmathsetmacroR5% 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 beginscope[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 pgfextraxdeftminx1xdeftmaxx2; endscope pgfmathsetmacroSmallR4 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); beginscope[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; endscope endtikzpicture enddocument

ingrese la descripción de la imagen aquí

Muchas gracias al gato de Schrödinger por 3dtools. En esta respuesta, uso Mathematica para encontrar las coordenadas de tres puntos A, B, C y dibuja un círculo (ABC). yo suelo tikz-3dplot-circleofsphere aquí para dibujar el estilo de la línea del círculo (ABC).

documentclass[12pt,tikz,border=2 mm]standalone
usepackagetikz-3dplot-circleofsphere
usetikzlibrary3dtools
begindocument
    tdplotsetmaincoords60110
begintikzpicture[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);
beginscope[tdplot_screen_coords] 
fill[ball color=green, opacity=0.8] (I) circle (R);
    endscope
beginscope[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)];
pgfmathsetmacromyaxisanglesaxisangles("(myn)")
pgfmathsetmacromyalphamyaxisangles[0]
pgfmathsetmacromybetamyaxisangles[1]
pgfmathsetmacromygamma-acos(sqrt(TD("(A-T)o(A-T)"))/R)
tdplotCsDrawCircle[tdplotCsFront/.style=thick]Rmyalphamybetamygamma 
endscope 

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;
    endtikzpicture
enddocument 

ingrese la descripción de la imagen aquí

Añado esto porque me pediste que usara el 3d circle through 3 points foto aquí. Se puede usar después de que tengamos tres puntos. Estos puntos se pueden construir sumando vectores de longitud 4, el radio, a T que se encuentran en el plano del círculo. Estos vectores se toman de la otra respuesta y se reescalan.

documentclass[12pt,tikz,border=2 mm]standalone
usepackagetikz-3dplot
usetikzlibrary3dtools,backgrounds
begindocument
tdplotsetmaincoords60110
begintikzpicture[tdplot_main_coords]
pgfmathsetmacromysq4/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] pic3d circle through 3 points=A=(A),B=(B),C=(C);

beginscope[tdplot_screen_coords, on background layer]
  pgfmathsetmacroR5%
  fill[ball color=purple, opacity=1.0] (I) circle (R); 
endscope
endtikzpicture
enddocument 

ingrese la descripción de la imagen aquí

valoraciones y reseñas

Si haces scroll puedes encontrar las anotaciones de otros usuarios, tú asimismo puedes insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *