Saltar al contenido

Dibujar a mano alzada, importar en TikZ

Nuestro equipo de trabajo ha estado mucho tiempo investigando la solución a tus dudas, te dejamos la soluciones por esto nuestro deseo es serte de gran ayuda.

Solución:

No es una respuesta y es solo por diversión. Entiendo que no solicitó los códigos. El propósito principal de esto es fundamentar la afirmación de que no es demasiado difícil dibujar estas formas irregulares con Ti elementalkSintaxis Z A continuación se muestran algunas reproducciones de dos de las figuras de su lista.

documentclass[tikz,border=3.14mm]standalone
usetikzlibrarycalc,intersections,arrows.meta
usepackagepgfplots
usepgfplotslibraryfillbetween
begindocument
begintikzpicture[long dash/.style=dash pattern=on 10pt off 2pt]
draw[ultra thick,long dash,name path=left,fill=orange!30] plot[smooth cycle] coordinates 
(0.3,-2) (-1,-3) (-8,-1.2) (-8.8,-0.2) (-7,0.6) (-1,-0.6);
draw[ultra thick,long dash,name path=left bottom] plot[smooth cycle] coordinates 
(-8,-2.8) (-9,-2.5) (-8.5,-1) (-7,0) (-6,1.7) (-5,1.7) (-4,-0) (-5.5,-2);
draw[ultra thick,long dash,name path=left top] plot[smooth cycle] coordinates 
(-7.2,-1) (-7.8,1) (-6.7,2) (-5.5,1) (-5,0) (-5.4,-1) (-6,-1.2);
path [%draw,blue,ultra thick,
    name path=left arc,
    intersection segments=
        of=left top and left,
        sequence=A1--B1
    ];
path [%draw,red,ultra thick,
    fill=red!30,
    name path=left blob,
    intersection segments=
        of=left bottom and left arc,
        sequence=A1--B0
    ];
node[fill,circle,label=above right:$F$] at (-6.1,-0.3);  
node at (-2.5,-1.8)$V_y$;    
% right part
path[fill=orange!30] plot[smooth cycle] coordinates 
(-1.3,2) (-0.7,3) (1,3.7) (5.2,3) (8,1.6) (8.4,1) (8,0.3) (6,0) (4,0) (2,0.3) (0,1);
path[fill=blue!30] plot[smooth cycle] coordinates 
(0,-2) (-0.3,-1.5) (-0.2,0) (-0.3,1) (-1,2) (0,2.8) (3,2) (7,1) (7.3,-1)
(6,-2.3) (4,-2.3) (2,-2);
draw[ultra thick,long dash,name path=right top] plot[smooth cycle] coordinates 
(-1.3,2) (-0.7,3) (1,3.7) (5.2,3) (8,1.6) (8.4,1) (8,0.3) (6,0) (4,0) (2,0.3) (0,1);
draw[ultra thick,name path=right] plot[smooth cycle] coordinates 
(0,-2) (-0.3,-1.5) (-0.2,0) (-0.3,1) (-1,2) (0,2.8) (3,2) (7,1) (7.3,-1)
(6,-2.3) (4,-2.3) (2,-2);
draw[ultra thick,long dash,name path=middle] plot[smooth cycle] coordinates 
(0,-3.4) (-1,-2) (-1,-0.5) (-1.5,0.4) (-1,1.6) (0,1.9) (2.1,1) (3,-1) (2.5,-3) (1,-3.7);
draw[ultra thick,long dash,name path=right bottom] plot[smooth cycle] coordinates 
(1,-3) (0.6,-2) (1.2,0) (3,0.8) (6,0.8) (8.5,1) (10,0) (9,-3) (7,-3.7) (5,-3.6) (2,-3.6);
path[name path=circle] (5.2,1.5) arc(-30:190:4mm);
path [%draw,red,ultra thick,
    name path=aux1,
    intersection segments=
        of=circle and right,
        sequence=B1
    ];
path [draw,blue!30,ultra thick,
    name path=aux2,
    intersection segments=
        of=circle and aux1,
        sequence=B0
    ];
node at (4.8,1.6)$U_y$;  
node[fill,circle,label=below right:$y$] at (3.3,1.5);    
node[fill=blue!30] at (3.7,0)$K$;    
endtikzpicture

begintikzpicture[thick]
draw[-latex] (0,0) -- (5,0) node[right]$s$;
draw[-latex] (0,0) -- (0,7) node[left]$y$;
draw (4,0) -- (4,5.5);
foreach X in 1,2,4.5
draw (0,X) -- (4,X);
foreach X/Y [count=Z]in 0/0,3.5/t,5.5/1

ifnumZ=1
draw[very thick,fill] (0,X) circle(1pt) node[left]$(0,Y)$ -- (4,X) 
coordinate[midway,below] (l1) circle(1pt)
node[below right]$(1,Y)$;
else
draw[very thick,fill] (0,X) circle(1pt) node[left]$(0,Y)$ -- (4,X) 
ifnumZ=2
coordinate[midway,below] (l3)
fi
ifnumZ=3
coordinate[midway,above] (l2)
fi
circle(1pt)
node[right]$(1,Y)$;
fi

draw[fill,very thick] (1.5,3.5) circle (1pt) node[below] $(s,t)$;
beginscope[xshift=6.5cm]

 draw[very thick] plot[smooth cycle] coordinates
 (0,2) (0,5) (1.3,7) (5,7.9) (8.2,6) (8.3,3) (6,1.4) (2,1.2);
 node[circle,fill,scale=0.6] (L) at (0.5,4);
 node[circle,fill,scale=0.6] (R) at (7.5,4.2);
 foreach X in -45,-20,-5,45,60
 pgfmathsetmacroY180-X+4*rnd
 draw (L) to[out=X,in=Y,looseness=1.2]  (R);
 ifnumX=-45
 path  (L) to[out=X,in=Y,looseness=1.2] coordinate[pos=0.5,below] (r1)
 node[pos=0.6,below]$sigma$ (R);
 fi
 ifnumX=60
path  (L) to[out=X,in=Y,looseness=1.2] coordinate[pos=0.4,above] (r2)
 node[pos=0.6,above]$tau$ (R);
 fi
 
 draw[very thick] (L) to[out=20,in=163,looseness=1.2] 
 node[pos=0.2,circle,fill,scale=0.6,label=above right:$h_t(s)$] 
 coordinate[pos=0.35] (r3) (R);
endscope
draw[-latex,shorten >=2pt] (l1) to[out=14,in=220] (r1);
draw[-latex,shorten >=2pt] (l2) to[out=24,in=140] (r2);
draw[-latex,shorten >=2pt] (l3) to[out=-12,in=210] (r3);
endtikzpicture

enddocument

ingrese la descripción de la imagen aquí

Deberían ilustrar que con TikZ puede hacer todo tipo de cosas interesantes como calcular las intersecciones de líneas y / o superficies. Por supuesto, puede hacer cosas similares con algún software de gráficos, pero en mi humilde opinión, la ventaja de este enfoque es que solo necesita cambiar una cosa para tener cambios globales. Por ejemplo, si no le gusta la longitud de los guiones, todo lo que necesita hacer es redefinir el estilo. Y por último, pero no menos importante, creo que es más divertido hacerlo de esa manera. Entiendo, por supuesto, que es posible que otros no compartan esa opinión.

APÉNDICE: Una propuesta para convertir gráficos a mano alzada en Ti “nice (r)”kCódigo Z Primero guarde sus gráficos a mano alzada en algún formato, aquí llamaré al archivo tmp.png (por lo que acabo de tomar la primera de tus fotos). Luego inclúyelo en un TikImagen Z y leer algunas coordenadas para smooth cycles etc.

documentclass[tikz,border=3.14mm]standalone
usetikzlibrarycalc
begindocument
begintikzpicture
node  (tmp)  includegraphicstmp.png;
draw (tmp.south west) grid (tmp.north east);
draw let p1=(tmp.south west), p2=(tmp.north east) in
pgfextrapgfmathsetmacroxminint(x1/1cm)
pgfmathsetmacroxmaxint(x2/1cm)
pgfmathsetmacroyminint(y1/1cm)
pgfmathsetmacroymaxint(y2/1cm)
typeoutxmin,xmax
foreach X in xmin,...,xmax (X,y1) node[anchor=north] X
foreach Y in ymin,...,ymax (x1,Y) node[anchor=east] Y;
endtikzpicture
enddocument

ingrese la descripción de la imagen aquí

Lo más probable es que se pueda escribir un código que extraiga algunas coordenadas a lo largo de los contornos. Supongo que con el aprendizaje automático será posible muy pronto dejar que la computadora haga eso. Es doloroso, sí, en la actualidad hacerlo a mano, pero no muy doloroso. (Y me disculpo de antemano si alguien ya ha hecho algo con la cuadrícula automática con etiquetas, no pude encontrarlo, así que lo escribí rápidamente yo mismo. En los ejemplos encontré que el rango de las etiquetas de tick estaba codificado).

Hay que ponderar el esfuerzo inicial y el de mantenimiento. La respuesta de @marmot es el camino a seguir si cree que necesitará modificar mucho los diagramas en el futuro.

Si cree que nunca cambiará los gráficos hechos a mano, tal vez una solución simple como importarlos y escribir sobre ellos con tikz, utilizando una cuadrícula de ayuda, es la forma más rápida.

Una posible solución intermedia es un salto al pasado y utilizar una solución basada en psfrag. Tenga en cuenta que este paquete no funciona (y no puede funcionar) con un motor moderno, por lo que se deben usar algunos trucos.

psfrag fue agradable, porque le permitió sustituir cadenas en un .eps archivo con la construcción LaTeX (lo que sea). Lo usé para mejorar la salida de mis circuitos dibujados con xcircuit (que es tan rápido de usar que nunca encontré algo mejor; aunque estoy tratando de moverme a tkcircuitz ahora tengo un gran tesoro de circuitos …).

Te lo mostraré con un ejemplo. Dibujé este circuito con etiquetas en texto plano; supongamos que se llama buffer.eps:

ingrese la descripción de la imagen aquí

y luego escribo un “archivo de sustitución”, lo llamo buffer-psfrag.eps:

mypsfr50SI50ohm

y tengo un genérico psfragdefinitions.tex:

%%
%% psfrag and general replacements
%%
newcommandpsfscale1.2

newcommandmypsf[2]%
  psfrag#1[Bl][Bl][psfscale]#2


mypsfR$R$
mypsfR1$R_1$
mypsfR2$R_2$
mypsfRin$R_mathrmin$
mypsfRout$R_mathrmout$
mypsfE$E$
mypsfI$I$
mypsfvo$v_o$
mypsfvs$v_s$
mypsfvi$v_i$
mypsfv+$v^+$
mypsfv-$v^-$
mypsfL+$L^+$
mypsfL-$L^-$

endinput

Luego uso un script de Python que escribí (adjunto al final de esta respuesta) que llama antiguo latex y realizar dvi->ps->pdf transformación tratando de incrustar y subconjuntar todas las fuentes (tuve problemas con eso …):

./epsfragtopdf.py buffer.eps

para obtener:

ingrese la descripción de la imagen aquí

Una vez que tenga un conjunto bien estructurado de scripts de inclusión y un Makefile para automatizarlo, es realmente rápido; las etiquetas se repiten a menudo y, por lo tanto, debe escribir los archivos psfrag solo una vez.

Supongo que puede hacer lo mismo con cualquier aplicación que le permita dibujar a mano, agregar etiquetas y guardar en PostScript encapsulado.

El guión llamado con subdir/name.eps utilizará psfrag definiciones encontradas en ./psfragdefinitios.tex, luego subdir/psfragdefinitions.tex y finalmente name-psfrag.tex :

#!/usr/bin/env python3
#
import sys
import os
import argparse
import tempfile
import subprocess
import shutil
#
latex_pre=r"""documentclass[12pt]article
usepackagegraphicx,psfrag
usepackage[active,tightpage]preview
usepackagesiunitx
"""
latex_med=r"""pagestyle empty
begindocument
centeringnullvfill
beginpreview
"""
latex_post=r"""endpreview
vfill
enddocument

"""
global_def_fname="psfragdefinitions.tex"
local_def_post="-psfrag"
latex_cmd="TEXINPUTS=$TEXINPUTS:../ latex -interaction nonstopmode go.tex >/dev/null 2>&1"
dvips_cmd="dvips go.dvi >/dev/null 2>&1"
ps2pdf_cmd="ps2pdf -dPDFSETTINGS=/prepress -dEmbedAllFonts=true -dSubsetFonts=true go.ps >/dev/null 2>&1" 
#
# Main
#
parser = argparse.ArgumentParser(description='Convert eps to pdf using psfrag')
parser.add_argument('--force', dest='force', action='store_true', default=False,
                   help='force conversion even if the PDF is newer (default: false)')
parser.add_argument('epsfiles', metavar='eps_file', nargs='+',
                   help='files to be converted')
args = parser.parse_args()
for filepath in args.epsfiles:
    filedir, filename = os.path.split(filepath)
    filebase, fileext = os.path.splitext(filename)
    # print ("dir:", filedir, " base:", filebase, " ext:", fileext)
    if fileext!= ".eps":
        print(filepath, "does not end in .eps, skipped")
        continue
    if not os.path.exists(filepath):
        print(filepath, "does not exists, skipped")
        continue
    targetfilename = filebase + ".pdf"
    targetfilepath = os.path.join(filedir, targetfilename)
    if os.path.exists(targetfilepath) and not args.force and os.path.getmtime(targetfilepath)>os.path.getmtime(filepath): 
        print(targetfilepath, "is newer than", filepath, ", skipped")
        continue
    print("processing", filepath, "to", targetfilepath)
    tmpdir = tempfile.mkdtemp(dir=".")
    # tmpdir = "tmp"
    if not os.path.exists(tmpdir): 
        os.mkdir(tmpdir)
    latexf = open(os.path.join(tmpdir,"go.tex"),"w")
    latexf.write(latex_pre)
    # search the file-definitions in the current dir, in the target dir
    if os.path.exists(global_def_fname):
        latexf.write("\input%sn" % os.path.join("..",global_def_fname))
        print("including",  global_def_fname)
    if filedir!="" and os.path.exists(os.path.join(filedir, global_def_fname)):
        latexf.write("\input%sn" % os.path.join("..", os.path.join(filedir, global_def_fname)))
        print("including",  os.path.join(filedir, global_def_fname))
    # search specific file-definition
    specfpath = os.path.join(filedir, filebase + local_def_post + ".tex")
    if os.path.exists(specfpath):
        latexf.write("\input%sn" % os.path.join("..", specfpath))
        print("including",  specfpath)
    latexf.write(latex_med)
    latexf.write("\includegraphics%sn" % os.path.join("..",filepath))
    latexf.write(latex_post)
    latexf.close()
    # now we build the figure
    subprocess.check_call(latex_cmd, cwd=tmpdir, shell=True)
    subprocess.check_call(dvips_cmd, cwd=tmpdir, shell=True)
    subprocess.check_call(ps2pdf_cmd,cwd=tmpdir,  shell=True)
    # now we copy the file back where it should be
    shutil.copy(os.path.join(tmpdir,"go.pdf"), targetfilepath)
    shutil.rmtree(tmpdir)

Sección de Reseñas y Valoraciones

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