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
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
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
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
valoraciones y reseñas
Si haces scroll puedes encontrar las anotaciones de otros usuarios, tú asimismo puedes insertar el tuyo si te apetece.