Ya no necesitas investigar más por todo internet porque estás al sitio indicado, tenemos la respuesta que buscas sin complicarte.
Solución:
Para dar una respuesta correcta, necesitamos definir producto cruzado y producto vectorial (este trabajo se realiza con metapost en cahier gutemberg 48 pero está en francés)
No tengo tiempo suficiente para definir todas estas macros, pero es posible encontrar una forma de dibujar el arco. Primero sabemos que el arco PQ (azul) está en el plano OPQ y es parte de un círculo de centro O y radio OP. Entonces busco un sistema de coordenadas xyz con x = OP e y = OA ‘. A es un punto del ecuador de longitud = -20. Por qué ? porque quiero el radio OP y OA del ecuador y OP perpendicular en OA. Luego necesito encontrar A ‘de longitud-20 y latitud> 30 pero necesito calcular el valor.
Actualización ¿Cómo determinar la latitud de A ‘?
En las siguientes imágenes, H es la proyección de Q en el plano (OPA). Es posible calcular el PH con dos lados (OP = 1 y OH = 0.866), encuentro 1.001. Entonces las líneas PH y OA tienen una intersección en el punto I. Ahora calculo OI = 1.238 y PI = 1.591. J es un punto de la línea OA ‘e I es la proyección de J en el plano (OPA). P, Q, J están alineados e IJ = 0,795. IJ / OI = 0,641 = tan (32,7). La latitud de A ‘es 32,7. Ahora puedo dibujar el círculo de radio 1 que pasa por P y A ‘con centro O.
Ahora necesito dibujar el círculo del centro O y el radio 1. El círculo pasa por P y A ‘pero también por Q. Dibujo el diámetro POP’ y QOQ ‘.
Todo: Cálculo para determinar correctamente la latitud de A ‘, producto cruzado para determinar N’. A macro para colocar un punto con longitud y latitud.
En mi código, redefiní personal macro con nombres que entiendo correctamente.
documentclass[11pt]scrartcl
usepackagetikz
usetikzlibrarycalc
tikzset%
add/.style args=#1 and #2
to path=%
($(tikztostart)!-#1!(tikztotarget)$)--($(tikztotarget)!-#2!(tikztostart)$)%
tikztonodes,add/.default=.2 and .2
tikzset%
mark coordinate/.style=inner sep=0pt,outer sep=0pt,minimum size=2pt,
fill=black,circle%
newcommandpgfmathsinandcos[3]%
pgfmathsetmacro#1sin(#3)%
pgfmathsetmacro#2cos(#3)%
newcommandLongitudePlane[2][current plane]%
pgfmathsinandcossinElcosElElevation % elevation
pgfmathsinandcossintcost#2 % azimuth
tikzset#1/.estyle=cm=cost,sint*sinEl,0,cosEl,(0,0)
newcommandLatitudePlane[2][current plane]%
pgfmathsinandcossinElcosElElevation % elevation
pgfmathsinandcossintcost#2 % latitude
pgfmathsetmacroydeltacosEl*sint
tikzset#1/.estyle=cm=cost,0,0,cost*sinEl,(0,ydelta) %
newcommandDrawLongitudeCircle[1]
LongitudePlane#1
tikzsetcurrent plane/.prefix style=scale=R
pgfmathsetmacroangVisatan(sin(#1)*cos(Elevation)/sin(Elevation)) %
draw[current plane,thin,black] (angVis:1) arc (angVis:angVis+180:1);
draw[current plane,thin,dashed] (angVis-180:1) arc (angVis-180:angVis:1);
%
newcommandDrawLatitudeCircle[1]
LatitudePlane#1
tikzsetcurrent plane/.prefix style=scale=R
pgfmathsetmacrosinVissin(#1)/cos(#1)*sin(Elevation)/cos(Elevation)
pgfmathsetmacroangVisasin(min(1,max(sinVis,-1)))
draw[current plane,thin,black] (angVis:1) arc (angVis:-angVis-180:1);
draw[current plane,thin,dashed] (180-angVis:1) arc (180-angVis:angVis:1);
%
newcommandDrawPointOnSphere[3]%
pgfmathsinandcossinLoMcosLoM#1
pgfmathsinandcossinLaMcosLaM#2
begindocument
nullvfill
begincenter
begintikzpicture
defR4 % sphere radius
defElevation25 % elevation angle
defangleLongitudeP-110 % longitude of point P
defangleLongitudeQ-45 % longitude of point Q
defangleLatitudeQ30 % latitude Q ; 0 latitude of P
defangleLongitudeA-20 % longitude of point A
pgfmathsetmacroHR*cos(Elevation) % distance to north pole
LongitudePlane[PLongitudePlane]angleLongitudeP
LongitudePlane[QLongitudePlane]angleLongitudeQ
LongitudePlane[ALongitudePlane]angleLongitudeA
fill[ball color=white!10] (0,0) circle (R); % 3D lighting effect
coordinate (O) at (0,0);
coordinate[] (N) at (0,H);
coordinate[] (S) at (0,-H);
DrawLongitudeCircleangleLongitudeP % PLongitudePlane
DrawLongitudeCircleangleLongitudeQ % QLongitudePlane
DrawLongitudeCircleangleLongitudeA
DrawLatitudeCircleangleLatitudeQ
DrawLatitudeCircle0 % equator
DrawLongitudeCircle0
%setup coordinates P and Q
path[ALongitudePlane] (0:R) coordinate (A);
path[ALongitudePlane] (32.5:R) coordinate (A');
path[ALongitudePlane] (122.5:R) coordinate (N');
path[PLongitudePlane] (0:R) coordinate (P);
draw[dashed,add= 1 and 0] (O) to (P);
path[QLongitudePlane] (angleLatitudeQ:R) coordinate (Q);
draw[dashed,add= 1 and 0] (O) to (Q) ;
path[QLongitudePlane] (0:R) coordinate (B);
draw [dashed] (O) -- (B) ;
draw [dashed] (O) -- (N) ;
foreach v in A,O,N,S,P,Q,A',B,N' coordinate[mark coordinate] (v) at (v);
node [above] at (v) v;
beginscope[ x=(P), y=(A'), z=(N')]
draw[dashed,fill opacity=.3] circle (1);
draw[blue] ( 0:1) arc (0:68:1) ;
draw[] ( 68:1) arc (68:115:1) ;
draw[] (-55:1) arc (-55:0:1);
draw[red,->](0,0,0)--(0,0,1);
draw[red,->](0,0,0)--(0,1,0);
draw[red,->](0,0,0)--(1,0,0);
endscope
endtikzpicture
endcenter
vfill
enddocument
El truco consiste en rotar el sistema de coordenadas. Este fragmento de código muestra el gran círculo que pasa por sus valores particulares para P y Q, así como un arco azul de P a Q.
beginscope[rotate around=30:(0,0)]
DrawLatitudeCircle[R]11
draw[current plane,blue,thick] (240:1) arc (240:310:1);
endscope
(Dejé caer un par de sus comandos de dibujo para que el resultado sea un poco más claro. Obviamente, todos los parámetros son específicos de este problema y, menos obviamente, se eligieron visualmente).
Una cosa que me confunde mucho en tikz / pgfplots es la falta de una función clara para dibujar un arco entre dos puntos con un centro de curvatura común.
Por lo que puedo ver, los arcos que se muestran aquí son todos grandes círculos o arcos con altitud constante (paralelos al ecuador). Tomé este problema y pensé primero en cómo dibujar un arco en general en 3D con un centro de curvatura fijo. Es decir, necesitamos los puntos $ A $, $ B $ y $ O $ el centro de curvatura del arco. Inicialmente quería llegar a una ecuación matemática que no depende de cómo estén configuradas mis coordenadas y no pude encontrarla. Publiqué el problema en el sitio de matemáticas de Stack Exchange y al día siguiente se me ocurrió una solución. La solución de ese problema está aquí:
arco entre dos puntos con un centro de curvatura
Dado que el número máximo de argumentos que toma un ” newcommand” macro es 9, y quería 11 parámetros (3 puntos cada uno con 3 coordenadas, número de puntos en el arco y color) Creé dos macros de la siguiente manera:
newcommandpointscolors[2]
deftempa#1
deftempb#2
newcommandmyarc[9]
%center
defox#1;
defoy#2;
defoz#3;
coordinate (O) at (ox,oy,oz);
%start
defax#4;
defay#5;
defaz#6;
coordinate (A) at (ax,ay,az);
%end
defbx#7
defby#8
defbz#9
coordinate (B) at (bx,by,bz);
draw[] (O) --(A) node[anchor=west] $A$;
draw[] (O) --(B) node[anchor=west] $B$;
%node[anchor=east] at (O) $O$;
draw[fill=tempb] (O) circle (2pt);
draw[fill=tempb] (A) circle (2pt);
draw[fill=tempb] (B) circle (2pt);
foreach t in 0,1,...,tempa
p
Tenga en cuenta que esto macro hace lo que sugieren mis ecuaciones en el arco de búsqueda entre dos puntas de vectores en 3D.
los macro entra en el preámbulo de LaTeX. Luego, en el documento principal utilicé una prueba para llamarlo. Aquí está la prueba:
tdplotsetmaincoords10100
begintikzpicture[scale=1.0, tdplot_main_coords]
% axes and origin of coordinate system
coordinate (Xa) at (4,0,0);
coordinate (Ya) at (0,4,0);
coordinate (Za) at (0,0,22);
coordinate (C) at (0,0,0);
% draw sphere
defR4;
fill[ball color=white!10] (C) circle (R); % 3D lighting effect
% set color and number of points
pointscolors[100][red];
% call macro "myarc"
myarc003310.45-310.45
% draw coordinate axes
draw[-latex] (C)--(Xa) node[yshift=-2mm] $ X$;
draw[-latex] (C)--(Ya) node[anchor=west] $Y$;
draw[-latex] (C)--(Za) node[anchor=south] $Z$;
endtikzpicture
Entonces la figura está aquí:
Creé otro gráfico para ayudar a explicar por qué el camino más corto entre dos puntos en una esfera es a lo largo de un círculo máximo. Esto fue motivado por la publicación de intercambio de pila: camino más corto en una esfera
La cifra para esa publicación es la siguiente.
y el código está aquí:
tdplotsetmaincoords2560
begintikzpicture[scale=1.0, tdplot_main_coords]
coordinate (Xa) at (4,0,0);
coordinate (Ya) at (0,4,0);
coordinate (Za) at (0,0,8);
coordinate (C) at (0,0,0);
% draw sphere
defR4;
fill[ball color=white!10] (C) circle (R); % 3D lighting effect
%foreach t in 0,4,1
%
%myarc00t032.6457513110645910-32.645751311064591;
%
pointscolors200green;
myarc000032.6457513110645910-32.645751311064591;
pointscolors200blue;
myarc000.5032.6457513110645910-32.645751311064591;
pointscolors200red;
myarc001.0032.6457513110645910-32.645751311064591;
pointscolors200brown;
myarc001.5032.6457513110645910-32.645751311064591;
pointscolors200orange;
myarc002.0032.6457513110645910-32.645751311064591;
pointscolors200orange;
%myarc002.645751311064591032.6457513110645910-32.645751311064591;
%pointscolors100yellow;
% draw coordinate axes
draw[-latex] (C)--(Xa) node[yshift=-2mm] $ X$;
draw[-latex] (C)--(Ya) node[anchor=west] $Y$;
draw[-latex] (C)--(Za) node[anchor=south] $Z$;
endtikzpicture
El argumento a favor del camino más corto es que estoy usando 200 puntos en cada arco. El arco verde corresponde a un gran círculo y todos los puntos están comprimidos. Los otros arcos crecen en longitud a medida que el centro de curvatura se mueve hacia arriba desde el origen.
La trama de puntos mediante el uso de “nodo” no es nada elegante. El número de puntos también está codificado. No tengo las especificaciones de alto nivel para desarrollar código de bajo nivel. Si alguien puede ayudar a mejorar esta función, esto podría ser muy beneficioso para toda la comunidad LaTeX.
Gracias.
Reseñas y calificaciones
Nos puedes favorecer nuestra función poniendo un comentario o puntuándolo te estamos eternamente agradecidos.