Saltar al contenido

Cómo dibujar diagramas de Penrose con TikZ

Solución:

El siguiente código debería ayudarlo a comenzar. Como supongo que eres un principiante de tikz, te daré algunas explicaciones básicas después del código:

Código

documentclass{standalone}
usepackage{tikz}
usetikzlibrary{decorations.pathmorphing}

begin{document}
begin{tikzpicture}
node (I)    at ( 4,0)   {I};
node (II)   at (-4,0)   {II};
node (III)  at (0, 2.5) {III};
node (IV)   at (0,-2.5) {IV};

path  % Four corners of left diamond
  (II) +(90:4)  coordinate[label=90:$i^+$]  (IItop)
       +(-90:4) coordinate[label=-90:$i^-$] (IIbot)
       +(0:4)   coordinate                  (IIright)
       +(180:4) coordinate[label=180:$i^0$] (IIleft)
       ;
draw (IIleft) -- 
          node[midway, above left]    {$cal{J}^+$}
          node[midway, below, sloped] {$bar{u}=infty$}
      (IItop) --
          node[midway, below, sloped] {$bar{u}=0$}
      (IIright) -- 
          node[midway, below, sloped] {$bar{u}=0$}
      (IIbot) --
          node[midway, above, sloped] {$bar{v}=-infty$}
          node[midway, below left]    {$cal{J}^-$}    
      (IIleft) -- cycle;

path % Four conners of the right diamond (no labels this time)
   (I) +(90:4)  coordinate (Itop)
       +(-90:4) coordinate (Ibot)
       +(180:4) coordinate (Ileft)
       +(0:4)   coordinate (Iright)
       ;
% No text this time in the next diagram
draw  (Ileft) -- (Itop) -- (Iright) -- (Ibot) -- (Ileft) -- cycle;

% Squiggly lines
draw[decorate,decoration=zigzag] (IItop) -- (Itop)
      node[midway, above, inner sep=2mm] {$r=0$};

draw[decorate,decoration=zigzag] (IIbot) -- (Ibot)
      node[midway, below, inner sep=2mm] {$r=0$};

end{tikzpicture}
end{document}

Resultado

Resultado

Explicaciones

Tikz tiene una sintaxis muy potente y versátil. Puede especificar las coordenadas de su dibujo de diferentes formas.

  • La primera y más sencilla es utilizar coordenadas cartesianas estándar, como (4,0). La unidad predeterminada es cm.
  • También puede especificar coordenadas polares, por ejemplo (90:4). El primer número es el ángulo, el segundo el radio (de nuevo en cm por defecto).
  • Puede dar un nombre a una coordenada y usar su nombre, como por ejemplo (I) o (II)
  • Al construir una ruta, puede especificar las coordenadas como absolutas (todas se miden respetando el origen que está en (0,0)) o relativo (todos se miden con respecto a algún origen dado). Para la sintaxis relativa, preceda la coordenada por +. Para dar el origen, especifique una primera coordenada sin el +.

Con lo anterior, puede leer ahora las primeras líneas. Cada uno de los iniciales node los comandos definen una coordenada nombrada, con nombres (I), (II) y así sucesivamente, en las coordenadas cartesianas absolutas dadas (4,0), (-4,0) etcétera). También colocan texto en esas coordenadas (el texto entre llaves {I}, {II}, etc.)

El siguiente path El comando hace muchas cosas. Comienza estableciendo la coordenada (II) como el origen de las coordenadas relativas restantes. Luego, usando coordenadas polares relativas a (II), se definen algunas otras coordenadas con nombre, en ángulos rectos alrededor (II) y distancia 4 unidades. Nombré esas coordenadas (IItop), (IIbot) etc, usando otra sintaxis que usa la palabra clave coordinate como parte de un camino. Al mismo tiempo, escribí algunas etiquetas en esas coordenadas, usando el label opción.

Una vez que las cuatro esquinas del diamante se definen de esa manera, se unen con líneas y se agregan algunas etiquetas por encima y por debajo de esas líneas. Esto se hace en el siguiente draw mando. los -- entre dos coordenadas especifica que se debe trazar una línea. Antes de la coordenada final de cada segmento utilizo el node palabra clave para colocar texto encima y debajo de esas líneas.

Para el diamante de la derecha, eliminé todas las etiquetas y dejé solo los comandos de dibujo. La colocación de las etiquetas debe ser casi idéntica al primer diamante y se deja como ejercicio.

Finalmente, se agregan las líneas onduladas, conectando las coordenadas apropiadas en la parte superior e inferior del diamante. Uso de nuevo un node[midway] para colocar texto encima (o debajo) de esas líneas.

Espero que esto te ayude a empezar, o al menos a motivarte a leer el manual y probar Tikz.

Actualizar

El OP solicitó en un comentario:

para dibujar un camino curvo de lo que has llamado Ibot al centro de la línea ondulada en la parte superior de III etiquetado r=0. Esto podría pasar aproximadamente 0,75 a través de la línea que une IIright y Itop.

Esto me da la oportunidad de introducir otras capacidades útiles de Tikz, que son calculado coordenadas. Para utilizar esta función, debe agregar calc a la lista de usetikzlibrary argumentos. En este caso:

usetikzlibrary{decorations.pathmorphing,calc}

Gracias a esta biblioteca, puede usar en cualquier lugar en el que se requiera una coordenada, una expresión matemática (encerrada por $) que implican operaciones de suma u otras con coordenadas. También define una operación especial llamada “interpolación”, que tiene la siguiente sintaxis: ($(A)!x!(B)$), dónde A y B son coordenadas (cartesianas, polares, nombradas …) y x es un número entre 0 y 1. La coordenada resultante es un punto ubicado en la línea AB, en un punto proporcional a x (0 significa A, 1 significa B). De hecho, x puede ser negativo o mayor que 1, lo que permite extrapolación.

Con esta función, el puente “en el medio de la línea ondulada superior” sería: ($(IItop)!.5!(Itop)$), por lo que el siguiente comando dibujaría una línea recta que conecta los dos puntos requeridos:

draw[->]  % The -> adds an arrow tip
    (Ibot) -- ($(IItop)!.5!(Itop)$);

Pero el OP solicitó una línea curva, no recta. Para obtener una línea curva, la forma más fácil (tikz también tiene varias formas) es reemplazar -- por el to operador. Este operador sin opciones dibuja una línea recta, el mismo que --, pero puedes darle opciones para curva la línea.

Por ejemplo, puede especificar el ángulo en el que la línea sale de Ibot, y el ángulo en el que debe entrar en el punto final. Esto produce una curva. Sin embargo, esos parámetros por sí solos no definen una sola curva, sino una familia de curvas. Puede ajustar la curva obtenida con el parámetro looseness, que es 1 por defecto. Aumentar este parámetro hace que la curva sea “más curva” y reducirla hace que la curva se acerque más a la línea recta original.

Por ensayo y error, encontré estos valores:

draw[->] 
    (Ibot) to[out=70, in=-15, looseness=1.5] ($(IItop)!.5!(Itop)$);

Y el resultado es:

ingrese la descripción de la imagen aquí

Una posibilidad (como JLDiaz menciona en su comentario) es usar coordenadas para especificar puntos, y luego dibujar las líneas que unen las coordenadas apropiadas; la biblioteca de decoraciones se puede utilizar para dibujar las líneas en zig-zag. Un punto de partida (jugando con mi código y leyendo la documentación de TikZ puedes agregar los elementos que faltan y personalizar el resultado):

documentclass{article}
usepackage{tikz}
usetikzlibrary{positioning,decorations.pathmorphing}

begin{document}

begin{tikzpicture}[node distance=2cm]
% coordinates for the nodes
coordinate (A) at (0,0);
coordinate[above right = of A,label=$i^{ast}$] (B);
coordinate[right = 3cm of B,label=$i^{ast}$] (C);
coordinate[below right = of C] (D);
coordinate[below right = of A] (E);
coordinate[right = 3cm of E] (F);
% some straight lines uning the coordinates and adding labels 
draw (A) -- node[above] {$f^{ast}$} (B) -- node[below,sloped,pos=0.25] {$bar{v}=0$} node[below,sloped,pos=0.75] {$H^{-}$}
(F) -- (D);
draw (A) -- (E) -- (C) -- (D);
% some decorated lines uning the coordinates and adding labels 
draw[decorate,decoration=zigzag] (B) -- node[above] {$r=0$} (C);
draw[decorate,decoration=zigzag] (E) -- node[below] {$r=0$} (F);
end{tikzpicture}

end{document}

ingrese la descripción de la imagen aquí

Tienes diferentes posibilidades. Con algunos comandos básicos de tikz puedes probar esto. Actualicé el primer código. El resultado final no es completo pero es un buen ejercicio terminarlo tú mismo.

Explicaciones

Tienes muchas buenas explicaciones en la respuesta de JLDIAZ. Intento agregar algunas explicaciones para comprender la diferencia entre los códigos.

Antes de dibujar algo, me gusta saber si necesito adaptar el tamaño de la imagen con scale por ejemplo. Prefiero evitar el positioning library si necesito una imagen a escala.

draw es una abreviatura de path[draw]. Es posible definir un path, dibujar este camino y definir, dibujar al mismo tiempo algunas coordenadas y nodos.

Con el siguiente código, puedo usar [scale=2] pero también es interesante definir algunas variables como myunit(aquí 4 significa 4 cm) con el pgfmathsetmacro command.

Entonces es imposible dibujar con un camino este tipo de gráficos. El primer camino comienza con
draw (0,0) y termina con cycle;.

Cuando agrega una nueva coordenada (relativa o absoluta), puede agregarla a la ruta nodes. Como puede ver, el código es muy simple, pero necesita saber por qué a veces necesita usar coordinate o algunas veces node. coordinate es un nodo especial con algunos parámetros diferentes.

Después --++(45:myunit) Obtengo una línea entre el origen (45:myunit) son coordenadas polares. Ahora puedo agregar algunos nodos entre los dos puntos.

  • Con coordinate (a)Nombré el último punto
  • Con node [above]{$i^+$} Coloqué un nodo básico encima del último punto.
  • Con node[pos=.5, above left] {$cal{J}^+$} Coloqué un nodo sobre la mitad de la línea definida por los últimos puntos.

La última posibilidad interesante se utiliza en la ruta final con

  • ` dibujar … nodo[above=6pt] nodo {$ r = 0 $}[below=1 cm] {III} “

Es posible colocar el nodo donde desee con algo como [below=1 cm]

documentclass{article}
usepackage{tikz}
usetikzlibrary{decorations.pathmorphing}

begin{document}

begin{tikzpicture}%[scale=2]
pgfmathsetmacromyunit{4} 
 draw     (0,0)            node [left] {$i^0$} 
       --++(45:myunit)     coordinate (a)
                            node[pos=.5, above left]    {$cal{J}^+$}
                            node[pos=.5, below, sloped] {$bar{u}=infty$}    
                            node [above]{$i^+$}
       --++(-45:2*myunit)  node[pos=.25, below, sloped] {$bar{u}=0$} 
                            coordinate (d)    
                            node [below]{$i^-$}
       --++(45:myunit)     node [right]{$i^0$}
       --++(135:myunit)    coordinate (b)    
                            node [above]{$i^+$}
       --++(-135:2*myunit) coordinate (c)    
                            node [below]{$i^-$}
       --cycle;

 draw [decorate, decoration=zigzag] (a) -- node[above=6pt] {$r=0$}
                                            node[below=1 cm] {III}
                                            (b) 

                                     (c) -- (d);

end{tikzpicture}
end{document} 

ingrese la descripción de la imagen aquí

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


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

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