Saltar al contenido

¿Cómo puedo dibujar un arco desde el punto A -> B en una esfera 3D en TikZ?

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.

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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).

ingrese la descripción de la imagen aquí

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í:

ingrese la descripción de la imagen 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.

ingrese la descripción de la imagen aquí

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.

¡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 *