Drawing a topological “handle” with TikzDrawing circular arrows in tikz to represent turns in a T-intersectionTikz: Once punctured torus?Decoration of (relative) segments of Bézier curvesDrawing Torus with semi-dashed line on itRotate a node but not its content: the case of the ellipse decorationHow to draw an elliptical arc in TikZ given only opposite extreme points (vertices) of the ellipse?TikZ scaling graphic and adjust node position and keep font sizeDraw edge on arcNumerical conditional within tikz keys?Tikz: Error “dimension too large” when decorating arcTikZ: Drawing an arc from an intersection to an intersectionLine up nested tikz enviroments or how to get rid of themProblems with nested TikZpicturesTikz: positionning a beginscope…endscope relatively to the left of another block
Can I Retrieve Email Addresses from BCC?
What does 権威 mean when referring to goods?
Teaching indefinite integrals that require special-casing
Freedom of speech and where it applies
Organic chemistry Iodoform Reaction
Could solar power be utilized and substitute coal in the 19th century?
The One-Electron Universe postulate is true - what simple change can I make to change the whole universe?
Can I create an upright 7-foot × 5-foot wall with the Minor Illusion spell?
Female=gender counterpart?
How to deal with or prevent idle in the test team?
What was required to accept "troll"?
I'm in charge of equipment buying but no one's ever happy with what I choose. How to fix this?
Can a Bard use an arcane focus?
A workplace installs custom certificates on personal devices, can this be used to decrypt HTTPS traffic?
Invariance of results when scaling explanatory variables in logistic regression, is there a proof?
What if somebody invests in my application?
Is it okay / does it make sense for another player to join a running game of Munchkin?
Was the picture area of a CRT a parallelogram (instead of a true rectangle)?
Why isn't KTEX's runway designation 10/28 instead of 9/27?
Word describing multiple paths to the same abstract outcome
Why are all the doors on Ferenginar (the Ferengi home world) far shorter than the average Ferengi?
Is there a good way to store credentials outside of a password manager?
What to do when my ideas aren't chosen, when I strongly disagree with the chosen solution?
Partial sums of primes
Drawing a topological “handle” with Tikz
Drawing circular arrows in tikz to represent turns in a T-intersectionTikz: Once punctured torus?Decoration of (relative) segments of Bézier curvesDrawing Torus with semi-dashed line on itRotate a node but not its content: the case of the ellipse decorationHow to draw an elliptical arc in TikZ given only opposite extreme points (vertices) of the ellipse?TikZ scaling graphic and adjust node position and keep font sizeDraw edge on arcNumerical conditional within tikz keys?Tikz: Error “dimension too large” when decorating arcTikZ: Drawing an arc from an intersection to an intersectionLine up nested tikz enviroments or how to get rid of themProblems with nested TikZpicturesTikz: positionning a beginscope…endscope relatively to the left of another block
I'm trying to do the following drawing in Tikz:
I almost finished the leftmost picture:
begintikzpicture
fill[blue!20] (7.5,0) ellipse (1 and .75);
draw (7.5,0) ellipse (1 and .75);
beginscope
clip (7.5,-.9) ellipse (1 and 1.25);
draw(7.5,1.1) ellipse (1 and 1.25);
clip (7.5,1.1) ellipse (1 and 1.25);
draw (7.5,-1.1) ellipse (1 and 1.25);
fill[white] (7.5,-1.1) ellipse (1 and 1.25);
endscope
draw (7.5,0) ellipse (0.8 and .47);
draw (7.5,.47) node[scale=0.8] $<$ node[above] $a$;
node (a) at (7.61,-.142894);
node (b) at (8,-.649519);
node (c) at ($(a)!0.5!(b)$) ;
beginscope[shift=(c),x=(a), scale=0.7]
draw (1,0) arc (0:180:1 and 0.3);
draw[dashed] (-1,0) arc (180:360:1 and 0.3);
endscope
draw (7.942,-0.555) node[scale=0.8,rotate=-85] $<$;
draw (7.67,-0.60) node $b$;
endtikzpicture
However I failed to do the "bubble" in the first drawing and to the second one. I appreciate any help.
The closest question I found here was this one: Tikz: Once punctured torus?
However, the answers there don't solve most of my problems.
tikz-pgf
add a comment |
I'm trying to do the following drawing in Tikz:
I almost finished the leftmost picture:
begintikzpicture
fill[blue!20] (7.5,0) ellipse (1 and .75);
draw (7.5,0) ellipse (1 and .75);
beginscope
clip (7.5,-.9) ellipse (1 and 1.25);
draw(7.5,1.1) ellipse (1 and 1.25);
clip (7.5,1.1) ellipse (1 and 1.25);
draw (7.5,-1.1) ellipse (1 and 1.25);
fill[white] (7.5,-1.1) ellipse (1 and 1.25);
endscope
draw (7.5,0) ellipse (0.8 and .47);
draw (7.5,.47) node[scale=0.8] $<$ node[above] $a$;
node (a) at (7.61,-.142894);
node (b) at (8,-.649519);
node (c) at ($(a)!0.5!(b)$) ;
beginscope[shift=(c),x=(a), scale=0.7]
draw (1,0) arc (0:180:1 and 0.3);
draw[dashed] (-1,0) arc (180:360:1 and 0.3);
endscope
draw (7.942,-0.555) node[scale=0.8,rotate=-85] $<$;
draw (7.67,-0.60) node $b$;
endtikzpicture
However I failed to do the "bubble" in the first drawing and to the second one. I appreciate any help.
The closest question I found here was this one: Tikz: Once punctured torus?
However, the answers there don't solve most of my problems.
tikz-pgf
add a comment |
I'm trying to do the following drawing in Tikz:
I almost finished the leftmost picture:
begintikzpicture
fill[blue!20] (7.5,0) ellipse (1 and .75);
draw (7.5,0) ellipse (1 and .75);
beginscope
clip (7.5,-.9) ellipse (1 and 1.25);
draw(7.5,1.1) ellipse (1 and 1.25);
clip (7.5,1.1) ellipse (1 and 1.25);
draw (7.5,-1.1) ellipse (1 and 1.25);
fill[white] (7.5,-1.1) ellipse (1 and 1.25);
endscope
draw (7.5,0) ellipse (0.8 and .47);
draw (7.5,.47) node[scale=0.8] $<$ node[above] $a$;
node (a) at (7.61,-.142894);
node (b) at (8,-.649519);
node (c) at ($(a)!0.5!(b)$) ;
beginscope[shift=(c),x=(a), scale=0.7]
draw (1,0) arc (0:180:1 and 0.3);
draw[dashed] (-1,0) arc (180:360:1 and 0.3);
endscope
draw (7.942,-0.555) node[scale=0.8,rotate=-85] $<$;
draw (7.67,-0.60) node $b$;
endtikzpicture
However I failed to do the "bubble" in the first drawing and to the second one. I appreciate any help.
The closest question I found here was this one: Tikz: Once punctured torus?
However, the answers there don't solve most of my problems.
tikz-pgf
I'm trying to do the following drawing in Tikz:
I almost finished the leftmost picture:
begintikzpicture
fill[blue!20] (7.5,0) ellipse (1 and .75);
draw (7.5,0) ellipse (1 and .75);
beginscope
clip (7.5,-.9) ellipse (1 and 1.25);
draw(7.5,1.1) ellipse (1 and 1.25);
clip (7.5,1.1) ellipse (1 and 1.25);
draw (7.5,-1.1) ellipse (1 and 1.25);
fill[white] (7.5,-1.1) ellipse (1 and 1.25);
endscope
draw (7.5,0) ellipse (0.8 and .47);
draw (7.5,.47) node[scale=0.8] $<$ node[above] $a$;
node (a) at (7.61,-.142894);
node (b) at (8,-.649519);
node (c) at ($(a)!0.5!(b)$) ;
beginscope[shift=(c),x=(a), scale=0.7]
draw (1,0) arc (0:180:1 and 0.3);
draw[dashed] (-1,0) arc (180:360:1 and 0.3);
endscope
draw (7.942,-0.555) node[scale=0.8,rotate=-85] $<$;
draw (7.67,-0.60) node $b$;
endtikzpicture
However I failed to do the "bubble" in the first drawing and to the second one. I appreciate any help.
The closest question I found here was this one: Tikz: Once punctured torus?
However, the answers there don't solve most of my problems.
tikz-pgf
tikz-pgf
asked yesterday
Gabriel RibeiroGabriel Ribeiro
35519
35519
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
If you really intend to play with these tori, you may eventually want to switch to 3d coordinates, where it is possible to find out whether a coordinate is on the visible or hidden patch.
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
begindocument
tdplotsetmaincoords600
tikzsetdeclare function=torusx(u,v,R,r)=cos(u)*(R + r*cos(v));
torusy(u,v,R,r)=(R + r*cos(v))*sin(u);
torusz(u,v,R,r)=r*sin(v);
vcrit1(u,th)=atan(tan(th)*sin(u));% first critical v value
vcrit2(u,th)=180+atan(tan(th)*sin(u));% second critical v value
disc(th,R,r)=((pow(r,2)-pow(R,2))*pow(cot(th),2)+%
pow(r,2)*(2+pow(tan(th),2)))/pow(R,2);% discriminant
umax(th,R,r)=ifthenelse(disc(th,R,r)>0,asin(sqrt(abs(disc(th,R,r)))),0);
begintikzpicture[tdplot_main_coords]
pgfmathsetmacroR4
pgfmathsetmacror1.5
draw[thick,fill=gray,even odd rule,fill opacity=0.2] plot[variable=x,domain=0:360,smooth,samples=71]
(torusx(x,vcrit1(x,tdplotmaintheta),R,r),
torusy(x,vcrit1(x,tdplotmaintheta),R,r),
torusz(x,vcrit1(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r):-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=umax(tdplotmaintheta,R,r):180-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
draw[thick] plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r)/2:-umax(tdplotmaintheta,R,r)/2,smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
foreach X in 300
draw[thick,dashed]
plot[smooth,variable=x,domain=360+vcrit1(X,tdplotmaintheta):vcrit2(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick]
plot[smooth,variable=x,domain=vcrit2(X,tdplotmaintheta):vcrit1(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex]
plot[smooth,variable=x,domain=vcrit1(X,tdplotmaintheta):90,samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex] plot[smooth,variable=x,domain=00:360,samples=71]
(torusx(x,90,R,r),
torusy(x,90,R,r),
torusz(x,90,R,r));
beginscope[declare function=myu(x)=sin(2*x)*sin(x);
myv(x)=sin(2*x)*cos(x);]
draw[thick,fill=white] plot[smooth,variable=x,domain=00:90,samples=71]
(torusx(-60+45*myu(x),90-45*myv(x),R,r),
torusy(-60+45*myu(x),90-45*myv(x),R,r),
torusz(-60+45*myu(x),90-45*myv(x),R,r));
endscope
endtikzpicture
enddocument
If you want a cartoon, consider e.g.
documentclass[tikz,border=3.14mm]standalone
usetikzlibraryarrows.meta,bending,decorations.markings,intersections
% https://tex.stackexchange.com/a/430239/121799
tikzset% inspired by https://tex.stackexchange.com/a/316050/121799
arc arrow/.style args=%
to pos #1 with length #2
decoration=
markings,
mark=at position 0 with pgfextra%
pgfmathsetmacrotmpArrowTime#2/(pgfdecoratedpathlength)
xdeftmpArrowTimetmpArrowTime,
mark=at position #1-tmpArrowTime with coordinate(@1);,
mark=at position #1-2*tmpArrowTime/3 with coordinate(@2);,
mark=at position #1-tmpArrowTime/3 with coordinate(@3);,
mark=at position #1 with coordinate(@4);
draw[-Stealth[length=#2,bend]]
(@1) .. controls (@2) and (@3) .. (@4);,
,
postaction=decorate,
,bent arrow/.style=arc arrow=to pos #1 with length 2mm,
begindocument
begintikzpicture[scale=4]
beginscope[local bounding box=left]
draw[fill=blue!20,even odd rule] (0,0) ellipse (1 and .75)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.25] (xt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw[bent arrow=0.2,thick,name path=b] (-65:1 and .75) to[out=40,in=10]
node[pos=0.2,right]$b$ (xt);
draw[dashed] (xt) to[out=-170,in=-140] (-65:1 and .75);
draw[bent arrow=0.98,thick,name path=a] (0.8,0.05) arc(0:360:0.8 and .5)
node[pos=0.2,below]$ell$ node[pos=0.98,right]$a$;
draw[name intersections=of=a and b,by=i,fill=white] (i)
to[out=45,in=-45] ++ (0.2,0.4) to[out=135,in=45](i);
endscope
%
beginscope[local bounding box=right,xshift=2.5cm]
draw[fill=blue!20,even odd rule]
(-0.7,-1) to[out=90,in=-90] (-1,0) arc(180:0:1 and .75)
to[out=-90,in=90] coordinate[pos=0.7] (ys) (0.7,-1) arc(0:180:0.7 and 0.12) coordinate[pos=0.5] (p)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.5] (yt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw (0.7,-1) arc(0:-180:0.7 and 0.12);
draw[bent arrow=0.5,thick] (p) to[out=70,in=-120] (-20:0.8 and .5)
arc(-20:200:0.8 and .5) node[pos=0.5,below]$a$ to[out=-60,in=110] cycle;
draw[bent arrow=0.5,thick] (p) to[out=80,in=180] node[pos=0.5,right]$b$ (yt);
draw[dashed] (yt) to[out=0,in=70] (ys);
draw[thick] (ys) to[out=-110,in=20] (p);
endscope
path (left) -- (right) node[midway,scale=2]$simeq$;
endtikzpicture
enddocument
Unlike in the above picture, you cannot adjust the view angle.
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
1
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
1
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
1
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
add a comment |
Using the tqft
package:
documentclassarticle
%urlhttps://tex.stackexchange.com/q/481212/86
usepackagetikz
usetikzlibrary
tqft,
decorations.markings,
arrows.meta,
hobby,
calc
begindocument
begintikzpicture[use Hobby shortcut]
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=top
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 0,
cobordism edge/.style=draw,
fill=gray!50,
name=bottom,
at=(top-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
,
postaction=decorate
]
(bottom-between first incoming and last incoming) to[out=45,in=-45] node[pos=.25,right] (b) coordinate[pos=.5] (a) (bottom-between incoming 1 and 2);
draw[dashed] (bottom-between first incoming and last incoming) to[out=135,in=-135] (bottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
] ([closed]$(bottom-between first incoming and last incoming)!.5!(bottom-between incoming 1 and 2)$) .. (bottom-incoming boundary 2.north) .. ($(top-between first and last outgoing)!.5!(top-between outgoing 1 and 2)$) .. (bottom-incoming boundary 1.north);
draw[fill=white] ([out angle=30]a) .. ++(1,.5) .. ++(.5,.6) .. ++(-.25,0) .. ([in angle=30]a);
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=secondtop,
at=(7,0)
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 1,
offset=.5,
cobordism edge/.style=draw,
every outgoing boundary component/.style=transform shape,draw,
fill=gray!50,
name=secondbottom,
at=(secondtop-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .5 with arrowLatex,
mark=at position .5 with node[right] (b);,
,
postaction=decorate
]
(secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between incoming 1 and 2);
draw (secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between last incoming and last outgoing);
draw[dashed] (secondbottom-between last incoming and last outgoing) to[out=45,in=0] (secondbottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
]
([out angle=90]secondbottom-outgoing boundary 1.north) .. (secondbottom-incoming boundary 2.north) .. ($(secondtop-between first and last outgoing)!.5!(secondtop-between outgoing 1 and 2)$) .. (secondbottom-incoming boundary 1.north) .. ([in angle=90]secondbottom-outgoing boundary 1.north);
node at ($(top-outgoing boundary 2.east)!.5!(secondtop-outgoing boundary 1.west)$) (simeq);
endtikzpicture
enddocument
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have atext
in an equation and then switch to math mode inside the text,tikzmarknode
does not seem to want to cooporate any more. (next comment)
– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "85"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f481212%2fdrawing-a-topological-handle-with-tikz%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
If you really intend to play with these tori, you may eventually want to switch to 3d coordinates, where it is possible to find out whether a coordinate is on the visible or hidden patch.
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
begindocument
tdplotsetmaincoords600
tikzsetdeclare function=torusx(u,v,R,r)=cos(u)*(R + r*cos(v));
torusy(u,v,R,r)=(R + r*cos(v))*sin(u);
torusz(u,v,R,r)=r*sin(v);
vcrit1(u,th)=atan(tan(th)*sin(u));% first critical v value
vcrit2(u,th)=180+atan(tan(th)*sin(u));% second critical v value
disc(th,R,r)=((pow(r,2)-pow(R,2))*pow(cot(th),2)+%
pow(r,2)*(2+pow(tan(th),2)))/pow(R,2);% discriminant
umax(th,R,r)=ifthenelse(disc(th,R,r)>0,asin(sqrt(abs(disc(th,R,r)))),0);
begintikzpicture[tdplot_main_coords]
pgfmathsetmacroR4
pgfmathsetmacror1.5
draw[thick,fill=gray,even odd rule,fill opacity=0.2] plot[variable=x,domain=0:360,smooth,samples=71]
(torusx(x,vcrit1(x,tdplotmaintheta),R,r),
torusy(x,vcrit1(x,tdplotmaintheta),R,r),
torusz(x,vcrit1(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r):-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=umax(tdplotmaintheta,R,r):180-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
draw[thick] plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r)/2:-umax(tdplotmaintheta,R,r)/2,smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
foreach X in 300
draw[thick,dashed]
plot[smooth,variable=x,domain=360+vcrit1(X,tdplotmaintheta):vcrit2(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick]
plot[smooth,variable=x,domain=vcrit2(X,tdplotmaintheta):vcrit1(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex]
plot[smooth,variable=x,domain=vcrit1(X,tdplotmaintheta):90,samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex] plot[smooth,variable=x,domain=00:360,samples=71]
(torusx(x,90,R,r),
torusy(x,90,R,r),
torusz(x,90,R,r));
beginscope[declare function=myu(x)=sin(2*x)*sin(x);
myv(x)=sin(2*x)*cos(x);]
draw[thick,fill=white] plot[smooth,variable=x,domain=00:90,samples=71]
(torusx(-60+45*myu(x),90-45*myv(x),R,r),
torusy(-60+45*myu(x),90-45*myv(x),R,r),
torusz(-60+45*myu(x),90-45*myv(x),R,r));
endscope
endtikzpicture
enddocument
If you want a cartoon, consider e.g.
documentclass[tikz,border=3.14mm]standalone
usetikzlibraryarrows.meta,bending,decorations.markings,intersections
% https://tex.stackexchange.com/a/430239/121799
tikzset% inspired by https://tex.stackexchange.com/a/316050/121799
arc arrow/.style args=%
to pos #1 with length #2
decoration=
markings,
mark=at position 0 with pgfextra%
pgfmathsetmacrotmpArrowTime#2/(pgfdecoratedpathlength)
xdeftmpArrowTimetmpArrowTime,
mark=at position #1-tmpArrowTime with coordinate(@1);,
mark=at position #1-2*tmpArrowTime/3 with coordinate(@2);,
mark=at position #1-tmpArrowTime/3 with coordinate(@3);,
mark=at position #1 with coordinate(@4);
draw[-Stealth[length=#2,bend]]
(@1) .. controls (@2) and (@3) .. (@4);,
,
postaction=decorate,
,bent arrow/.style=arc arrow=to pos #1 with length 2mm,
begindocument
begintikzpicture[scale=4]
beginscope[local bounding box=left]
draw[fill=blue!20,even odd rule] (0,0) ellipse (1 and .75)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.25] (xt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw[bent arrow=0.2,thick,name path=b] (-65:1 and .75) to[out=40,in=10]
node[pos=0.2,right]$b$ (xt);
draw[dashed] (xt) to[out=-170,in=-140] (-65:1 and .75);
draw[bent arrow=0.98,thick,name path=a] (0.8,0.05) arc(0:360:0.8 and .5)
node[pos=0.2,below]$ell$ node[pos=0.98,right]$a$;
draw[name intersections=of=a and b,by=i,fill=white] (i)
to[out=45,in=-45] ++ (0.2,0.4) to[out=135,in=45](i);
endscope
%
beginscope[local bounding box=right,xshift=2.5cm]
draw[fill=blue!20,even odd rule]
(-0.7,-1) to[out=90,in=-90] (-1,0) arc(180:0:1 and .75)
to[out=-90,in=90] coordinate[pos=0.7] (ys) (0.7,-1) arc(0:180:0.7 and 0.12) coordinate[pos=0.5] (p)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.5] (yt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw (0.7,-1) arc(0:-180:0.7 and 0.12);
draw[bent arrow=0.5,thick] (p) to[out=70,in=-120] (-20:0.8 and .5)
arc(-20:200:0.8 and .5) node[pos=0.5,below]$a$ to[out=-60,in=110] cycle;
draw[bent arrow=0.5,thick] (p) to[out=80,in=180] node[pos=0.5,right]$b$ (yt);
draw[dashed] (yt) to[out=0,in=70] (ys);
draw[thick] (ys) to[out=-110,in=20] (p);
endscope
path (left) -- (right) node[midway,scale=2]$simeq$;
endtikzpicture
enddocument
Unlike in the above picture, you cannot adjust the view angle.
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
1
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
1
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
1
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
add a comment |
If you really intend to play with these tori, you may eventually want to switch to 3d coordinates, where it is possible to find out whether a coordinate is on the visible or hidden patch.
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
begindocument
tdplotsetmaincoords600
tikzsetdeclare function=torusx(u,v,R,r)=cos(u)*(R + r*cos(v));
torusy(u,v,R,r)=(R + r*cos(v))*sin(u);
torusz(u,v,R,r)=r*sin(v);
vcrit1(u,th)=atan(tan(th)*sin(u));% first critical v value
vcrit2(u,th)=180+atan(tan(th)*sin(u));% second critical v value
disc(th,R,r)=((pow(r,2)-pow(R,2))*pow(cot(th),2)+%
pow(r,2)*(2+pow(tan(th),2)))/pow(R,2);% discriminant
umax(th,R,r)=ifthenelse(disc(th,R,r)>0,asin(sqrt(abs(disc(th,R,r)))),0);
begintikzpicture[tdplot_main_coords]
pgfmathsetmacroR4
pgfmathsetmacror1.5
draw[thick,fill=gray,even odd rule,fill opacity=0.2] plot[variable=x,domain=0:360,smooth,samples=71]
(torusx(x,vcrit1(x,tdplotmaintheta),R,r),
torusy(x,vcrit1(x,tdplotmaintheta),R,r),
torusz(x,vcrit1(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r):-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=umax(tdplotmaintheta,R,r):180-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
draw[thick] plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r)/2:-umax(tdplotmaintheta,R,r)/2,smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
foreach X in 300
draw[thick,dashed]
plot[smooth,variable=x,domain=360+vcrit1(X,tdplotmaintheta):vcrit2(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick]
plot[smooth,variable=x,domain=vcrit2(X,tdplotmaintheta):vcrit1(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex]
plot[smooth,variable=x,domain=vcrit1(X,tdplotmaintheta):90,samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex] plot[smooth,variable=x,domain=00:360,samples=71]
(torusx(x,90,R,r),
torusy(x,90,R,r),
torusz(x,90,R,r));
beginscope[declare function=myu(x)=sin(2*x)*sin(x);
myv(x)=sin(2*x)*cos(x);]
draw[thick,fill=white] plot[smooth,variable=x,domain=00:90,samples=71]
(torusx(-60+45*myu(x),90-45*myv(x),R,r),
torusy(-60+45*myu(x),90-45*myv(x),R,r),
torusz(-60+45*myu(x),90-45*myv(x),R,r));
endscope
endtikzpicture
enddocument
If you want a cartoon, consider e.g.
documentclass[tikz,border=3.14mm]standalone
usetikzlibraryarrows.meta,bending,decorations.markings,intersections
% https://tex.stackexchange.com/a/430239/121799
tikzset% inspired by https://tex.stackexchange.com/a/316050/121799
arc arrow/.style args=%
to pos #1 with length #2
decoration=
markings,
mark=at position 0 with pgfextra%
pgfmathsetmacrotmpArrowTime#2/(pgfdecoratedpathlength)
xdeftmpArrowTimetmpArrowTime,
mark=at position #1-tmpArrowTime with coordinate(@1);,
mark=at position #1-2*tmpArrowTime/3 with coordinate(@2);,
mark=at position #1-tmpArrowTime/3 with coordinate(@3);,
mark=at position #1 with coordinate(@4);
draw[-Stealth[length=#2,bend]]
(@1) .. controls (@2) and (@3) .. (@4);,
,
postaction=decorate,
,bent arrow/.style=arc arrow=to pos #1 with length 2mm,
begindocument
begintikzpicture[scale=4]
beginscope[local bounding box=left]
draw[fill=blue!20,even odd rule] (0,0) ellipse (1 and .75)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.25] (xt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw[bent arrow=0.2,thick,name path=b] (-65:1 and .75) to[out=40,in=10]
node[pos=0.2,right]$b$ (xt);
draw[dashed] (xt) to[out=-170,in=-140] (-65:1 and .75);
draw[bent arrow=0.98,thick,name path=a] (0.8,0.05) arc(0:360:0.8 and .5)
node[pos=0.2,below]$ell$ node[pos=0.98,right]$a$;
draw[name intersections=of=a and b,by=i,fill=white] (i)
to[out=45,in=-45] ++ (0.2,0.4) to[out=135,in=45](i);
endscope
%
beginscope[local bounding box=right,xshift=2.5cm]
draw[fill=blue!20,even odd rule]
(-0.7,-1) to[out=90,in=-90] (-1,0) arc(180:0:1 and .75)
to[out=-90,in=90] coordinate[pos=0.7] (ys) (0.7,-1) arc(0:180:0.7 and 0.12) coordinate[pos=0.5] (p)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.5] (yt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw (0.7,-1) arc(0:-180:0.7 and 0.12);
draw[bent arrow=0.5,thick] (p) to[out=70,in=-120] (-20:0.8 and .5)
arc(-20:200:0.8 and .5) node[pos=0.5,below]$a$ to[out=-60,in=110] cycle;
draw[bent arrow=0.5,thick] (p) to[out=80,in=180] node[pos=0.5,right]$b$ (yt);
draw[dashed] (yt) to[out=0,in=70] (ys);
draw[thick] (ys) to[out=-110,in=20] (p);
endscope
path (left) -- (right) node[midway,scale=2]$simeq$;
endtikzpicture
enddocument
Unlike in the above picture, you cannot adjust the view angle.
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
1
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
1
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
1
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
add a comment |
If you really intend to play with these tori, you may eventually want to switch to 3d coordinates, where it is possible to find out whether a coordinate is on the visible or hidden patch.
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
begindocument
tdplotsetmaincoords600
tikzsetdeclare function=torusx(u,v,R,r)=cos(u)*(R + r*cos(v));
torusy(u,v,R,r)=(R + r*cos(v))*sin(u);
torusz(u,v,R,r)=r*sin(v);
vcrit1(u,th)=atan(tan(th)*sin(u));% first critical v value
vcrit2(u,th)=180+atan(tan(th)*sin(u));% second critical v value
disc(th,R,r)=((pow(r,2)-pow(R,2))*pow(cot(th),2)+%
pow(r,2)*(2+pow(tan(th),2)))/pow(R,2);% discriminant
umax(th,R,r)=ifthenelse(disc(th,R,r)>0,asin(sqrt(abs(disc(th,R,r)))),0);
begintikzpicture[tdplot_main_coords]
pgfmathsetmacroR4
pgfmathsetmacror1.5
draw[thick,fill=gray,even odd rule,fill opacity=0.2] plot[variable=x,domain=0:360,smooth,samples=71]
(torusx(x,vcrit1(x,tdplotmaintheta),R,r),
torusy(x,vcrit1(x,tdplotmaintheta),R,r),
torusz(x,vcrit1(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r):-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=umax(tdplotmaintheta,R,r):180-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
draw[thick] plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r)/2:-umax(tdplotmaintheta,R,r)/2,smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
foreach X in 300
draw[thick,dashed]
plot[smooth,variable=x,domain=360+vcrit1(X,tdplotmaintheta):vcrit2(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick]
plot[smooth,variable=x,domain=vcrit2(X,tdplotmaintheta):vcrit1(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex]
plot[smooth,variable=x,domain=vcrit1(X,tdplotmaintheta):90,samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex] plot[smooth,variable=x,domain=00:360,samples=71]
(torusx(x,90,R,r),
torusy(x,90,R,r),
torusz(x,90,R,r));
beginscope[declare function=myu(x)=sin(2*x)*sin(x);
myv(x)=sin(2*x)*cos(x);]
draw[thick,fill=white] plot[smooth,variable=x,domain=00:90,samples=71]
(torusx(-60+45*myu(x),90-45*myv(x),R,r),
torusy(-60+45*myu(x),90-45*myv(x),R,r),
torusz(-60+45*myu(x),90-45*myv(x),R,r));
endscope
endtikzpicture
enddocument
If you want a cartoon, consider e.g.
documentclass[tikz,border=3.14mm]standalone
usetikzlibraryarrows.meta,bending,decorations.markings,intersections
% https://tex.stackexchange.com/a/430239/121799
tikzset% inspired by https://tex.stackexchange.com/a/316050/121799
arc arrow/.style args=%
to pos #1 with length #2
decoration=
markings,
mark=at position 0 with pgfextra%
pgfmathsetmacrotmpArrowTime#2/(pgfdecoratedpathlength)
xdeftmpArrowTimetmpArrowTime,
mark=at position #1-tmpArrowTime with coordinate(@1);,
mark=at position #1-2*tmpArrowTime/3 with coordinate(@2);,
mark=at position #1-tmpArrowTime/3 with coordinate(@3);,
mark=at position #1 with coordinate(@4);
draw[-Stealth[length=#2,bend]]
(@1) .. controls (@2) and (@3) .. (@4);,
,
postaction=decorate,
,bent arrow/.style=arc arrow=to pos #1 with length 2mm,
begindocument
begintikzpicture[scale=4]
beginscope[local bounding box=left]
draw[fill=blue!20,even odd rule] (0,0) ellipse (1 and .75)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.25] (xt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw[bent arrow=0.2,thick,name path=b] (-65:1 and .75) to[out=40,in=10]
node[pos=0.2,right]$b$ (xt);
draw[dashed] (xt) to[out=-170,in=-140] (-65:1 and .75);
draw[bent arrow=0.98,thick,name path=a] (0.8,0.05) arc(0:360:0.8 and .5)
node[pos=0.2,below]$ell$ node[pos=0.98,right]$a$;
draw[name intersections=of=a and b,by=i,fill=white] (i)
to[out=45,in=-45] ++ (0.2,0.4) to[out=135,in=45](i);
endscope
%
beginscope[local bounding box=right,xshift=2.5cm]
draw[fill=blue!20,even odd rule]
(-0.7,-1) to[out=90,in=-90] (-1,0) arc(180:0:1 and .75)
to[out=-90,in=90] coordinate[pos=0.7] (ys) (0.7,-1) arc(0:180:0.7 and 0.12) coordinate[pos=0.5] (p)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.5] (yt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw (0.7,-1) arc(0:-180:0.7 and 0.12);
draw[bent arrow=0.5,thick] (p) to[out=70,in=-120] (-20:0.8 and .5)
arc(-20:200:0.8 and .5) node[pos=0.5,below]$a$ to[out=-60,in=110] cycle;
draw[bent arrow=0.5,thick] (p) to[out=80,in=180] node[pos=0.5,right]$b$ (yt);
draw[dashed] (yt) to[out=0,in=70] (ys);
draw[thick] (ys) to[out=-110,in=20] (p);
endscope
path (left) -- (right) node[midway,scale=2]$simeq$;
endtikzpicture
enddocument
Unlike in the above picture, you cannot adjust the view angle.
If you really intend to play with these tori, you may eventually want to switch to 3d coordinates, where it is possible to find out whether a coordinate is on the visible or hidden patch.
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
begindocument
tdplotsetmaincoords600
tikzsetdeclare function=torusx(u,v,R,r)=cos(u)*(R + r*cos(v));
torusy(u,v,R,r)=(R + r*cos(v))*sin(u);
torusz(u,v,R,r)=r*sin(v);
vcrit1(u,th)=atan(tan(th)*sin(u));% first critical v value
vcrit2(u,th)=180+atan(tan(th)*sin(u));% second critical v value
disc(th,R,r)=((pow(r,2)-pow(R,2))*pow(cot(th),2)+%
pow(r,2)*(2+pow(tan(th),2)))/pow(R,2);% discriminant
umax(th,R,r)=ifthenelse(disc(th,R,r)>0,asin(sqrt(abs(disc(th,R,r)))),0);
begintikzpicture[tdplot_main_coords]
pgfmathsetmacroR4
pgfmathsetmacror1.5
draw[thick,fill=gray,even odd rule,fill opacity=0.2] plot[variable=x,domain=0:360,smooth,samples=71]
(torusx(x,vcrit1(x,tdplotmaintheta),R,r),
torusy(x,vcrit1(x,tdplotmaintheta),R,r),
torusz(x,vcrit1(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r):-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r))
plot[variable=x,
domain=umax(tdplotmaintheta,R,r):180-umax(tdplotmaintheta,R,r),smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
draw[thick] plot[variable=x,
domain=-180+umax(tdplotmaintheta,R,r)/2:-umax(tdplotmaintheta,R,r)/2,smooth,samples=51]
(torusx(x,vcrit2(x,tdplotmaintheta),R,r),
torusy(x,vcrit2(x,tdplotmaintheta),R,r),
torusz(x,vcrit2(x,tdplotmaintheta),R,r));
foreach X in 300
draw[thick,dashed]
plot[smooth,variable=x,domain=360+vcrit1(X,tdplotmaintheta):vcrit2(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick]
plot[smooth,variable=x,domain=vcrit2(X,tdplotmaintheta):vcrit1(X,tdplotmaintheta),samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex]
plot[smooth,variable=x,domain=vcrit1(X,tdplotmaintheta):90,samples=71]
(torusx(X,x,R,r),torusy(X,x,R,r),torusz(X,x,R,r));
draw[thick,-latex] plot[smooth,variable=x,domain=00:360,samples=71]
(torusx(x,90,R,r),
torusy(x,90,R,r),
torusz(x,90,R,r));
beginscope[declare function=myu(x)=sin(2*x)*sin(x);
myv(x)=sin(2*x)*cos(x);]
draw[thick,fill=white] plot[smooth,variable=x,domain=00:90,samples=71]
(torusx(-60+45*myu(x),90-45*myv(x),R,r),
torusy(-60+45*myu(x),90-45*myv(x),R,r),
torusz(-60+45*myu(x),90-45*myv(x),R,r));
endscope
endtikzpicture
enddocument
If you want a cartoon, consider e.g.
documentclass[tikz,border=3.14mm]standalone
usetikzlibraryarrows.meta,bending,decorations.markings,intersections
% https://tex.stackexchange.com/a/430239/121799
tikzset% inspired by https://tex.stackexchange.com/a/316050/121799
arc arrow/.style args=%
to pos #1 with length #2
decoration=
markings,
mark=at position 0 with pgfextra%
pgfmathsetmacrotmpArrowTime#2/(pgfdecoratedpathlength)
xdeftmpArrowTimetmpArrowTime,
mark=at position #1-tmpArrowTime with coordinate(@1);,
mark=at position #1-2*tmpArrowTime/3 with coordinate(@2);,
mark=at position #1-tmpArrowTime/3 with coordinate(@3);,
mark=at position #1 with coordinate(@4);
draw[-Stealth[length=#2,bend]]
(@1) .. controls (@2) and (@3) .. (@4);,
,
postaction=decorate,
,bent arrow/.style=arc arrow=to pos #1 with length 2mm,
begindocument
begintikzpicture[scale=4]
beginscope[local bounding box=left]
draw[fill=blue!20,even odd rule] (0,0) ellipse (1 and .75)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.25] (xt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw[bent arrow=0.2,thick,name path=b] (-65:1 and .75) to[out=40,in=10]
node[pos=0.2,right]$b$ (xt);
draw[dashed] (xt) to[out=-170,in=-140] (-65:1 and .75);
draw[bent arrow=0.98,thick,name path=a] (0.8,0.05) arc(0:360:0.8 and .5)
node[pos=0.2,below]$ell$ node[pos=0.98,right]$a$;
draw[name intersections=of=a and b,by=i,fill=white] (i)
to[out=45,in=-45] ++ (0.2,0.4) to[out=135,in=45](i);
endscope
%
beginscope[local bounding box=right,xshift=2.5cm]
draw[fill=blue!20,even odd rule]
(-0.7,-1) to[out=90,in=-90] (-1,0) arc(180:0:1 and .75)
to[out=-90,in=90] coordinate[pos=0.7] (ys) (0.7,-1) arc(0:180:0.7 and 0.12) coordinate[pos=0.5] (p)
(-0.5,0) arc(120:60:1 and 1.25) arc(-60:-120:1 and 1.25) coordinate[pos=0.5] (yt);
draw (-0.5,0) arc(-120:-130:1 and 1.25) (0.5,0) arc(-60:-50:1 and 1.25);
draw (0.7,-1) arc(0:-180:0.7 and 0.12);
draw[bent arrow=0.5,thick] (p) to[out=70,in=-120] (-20:0.8 and .5)
arc(-20:200:0.8 and .5) node[pos=0.5,below]$a$ to[out=-60,in=110] cycle;
draw[bent arrow=0.5,thick] (p) to[out=80,in=180] node[pos=0.5,right]$b$ (yt);
draw[dashed] (yt) to[out=0,in=70] (ys);
draw[thick] (ys) to[out=-110,in=20] (p);
endscope
path (left) -- (right) node[midway,scale=2]$simeq$;
endtikzpicture
enddocument
Unlike in the above picture, you cannot adjust the view angle.
edited yesterday
answered yesterday
marmotmarmot
112k5140264
112k5140264
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
1
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
1
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
1
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
add a comment |
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
1
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
1
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
1
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
Is it also easier to do the second picture with this method?
– Gabriel Ribeiro
yesterday
1
1
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
@GabrielRibeiro It depends on what you want to do in the end. This proposal makes more sense if you have to draw several tori with cycles and so on. If you just need two quick cartoons, this might be an overkill.
– marmot
yesterday
1
1
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
@GabrielRibeiro I also added cartoons.
– marmot
yesterday
1
1
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
This is beautiful! Thank you a lot
– Gabriel Ribeiro
yesterday
add a comment |
Using the tqft
package:
documentclassarticle
%urlhttps://tex.stackexchange.com/q/481212/86
usepackagetikz
usetikzlibrary
tqft,
decorations.markings,
arrows.meta,
hobby,
calc
begindocument
begintikzpicture[use Hobby shortcut]
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=top
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 0,
cobordism edge/.style=draw,
fill=gray!50,
name=bottom,
at=(top-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
,
postaction=decorate
]
(bottom-between first incoming and last incoming) to[out=45,in=-45] node[pos=.25,right] (b) coordinate[pos=.5] (a) (bottom-between incoming 1 and 2);
draw[dashed] (bottom-between first incoming and last incoming) to[out=135,in=-135] (bottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
] ([closed]$(bottom-between first incoming and last incoming)!.5!(bottom-between incoming 1 and 2)$) .. (bottom-incoming boundary 2.north) .. ($(top-between first and last outgoing)!.5!(top-between outgoing 1 and 2)$) .. (bottom-incoming boundary 1.north);
draw[fill=white] ([out angle=30]a) .. ++(1,.5) .. ++(.5,.6) .. ++(-.25,0) .. ([in angle=30]a);
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=secondtop,
at=(7,0)
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 1,
offset=.5,
cobordism edge/.style=draw,
every outgoing boundary component/.style=transform shape,draw,
fill=gray!50,
name=secondbottom,
at=(secondtop-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .5 with arrowLatex,
mark=at position .5 with node[right] (b);,
,
postaction=decorate
]
(secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between incoming 1 and 2);
draw (secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between last incoming and last outgoing);
draw[dashed] (secondbottom-between last incoming and last outgoing) to[out=45,in=0] (secondbottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
]
([out angle=90]secondbottom-outgoing boundary 1.north) .. (secondbottom-incoming boundary 2.north) .. ($(secondtop-between first and last outgoing)!.5!(secondtop-between outgoing 1 and 2)$) .. (secondbottom-incoming boundary 1.north) .. ([in angle=90]secondbottom-outgoing boundary 1.north);
node at ($(top-outgoing boundary 2.east)!.5!(secondtop-outgoing boundary 1.west)$) (simeq);
endtikzpicture
enddocument
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have atext
in an equation and then switch to math mode inside the text,tikzmarknode
does not seem to want to cooporate any more. (next comment)
– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
add a comment |
Using the tqft
package:
documentclassarticle
%urlhttps://tex.stackexchange.com/q/481212/86
usepackagetikz
usetikzlibrary
tqft,
decorations.markings,
arrows.meta,
hobby,
calc
begindocument
begintikzpicture[use Hobby shortcut]
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=top
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 0,
cobordism edge/.style=draw,
fill=gray!50,
name=bottom,
at=(top-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
,
postaction=decorate
]
(bottom-between first incoming and last incoming) to[out=45,in=-45] node[pos=.25,right] (b) coordinate[pos=.5] (a) (bottom-between incoming 1 and 2);
draw[dashed] (bottom-between first incoming and last incoming) to[out=135,in=-135] (bottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
] ([closed]$(bottom-between first incoming and last incoming)!.5!(bottom-between incoming 1 and 2)$) .. (bottom-incoming boundary 2.north) .. ($(top-between first and last outgoing)!.5!(top-between outgoing 1 and 2)$) .. (bottom-incoming boundary 1.north);
draw[fill=white] ([out angle=30]a) .. ++(1,.5) .. ++(.5,.6) .. ++(-.25,0) .. ([in angle=30]a);
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=secondtop,
at=(7,0)
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 1,
offset=.5,
cobordism edge/.style=draw,
every outgoing boundary component/.style=transform shape,draw,
fill=gray!50,
name=secondbottom,
at=(secondtop-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .5 with arrowLatex,
mark=at position .5 with node[right] (b);,
,
postaction=decorate
]
(secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between incoming 1 and 2);
draw (secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between last incoming and last outgoing);
draw[dashed] (secondbottom-between last incoming and last outgoing) to[out=45,in=0] (secondbottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
]
([out angle=90]secondbottom-outgoing boundary 1.north) .. (secondbottom-incoming boundary 2.north) .. ($(secondtop-between first and last outgoing)!.5!(secondtop-between outgoing 1 and 2)$) .. (secondbottom-incoming boundary 1.north) .. ([in angle=90]secondbottom-outgoing boundary 1.north);
node at ($(top-outgoing boundary 2.east)!.5!(secondtop-outgoing boundary 1.west)$) (simeq);
endtikzpicture
enddocument
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have atext
in an equation and then switch to math mode inside the text,tikzmarknode
does not seem to want to cooporate any more. (next comment)
– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
add a comment |
Using the tqft
package:
documentclassarticle
%urlhttps://tex.stackexchange.com/q/481212/86
usepackagetikz
usetikzlibrary
tqft,
decorations.markings,
arrows.meta,
hobby,
calc
begindocument
begintikzpicture[use Hobby shortcut]
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=top
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 0,
cobordism edge/.style=draw,
fill=gray!50,
name=bottom,
at=(top-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
,
postaction=decorate
]
(bottom-between first incoming and last incoming) to[out=45,in=-45] node[pos=.25,right] (b) coordinate[pos=.5] (a) (bottom-between incoming 1 and 2);
draw[dashed] (bottom-between first incoming and last incoming) to[out=135,in=-135] (bottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
] ([closed]$(bottom-between first incoming and last incoming)!.5!(bottom-between incoming 1 and 2)$) .. (bottom-incoming boundary 2.north) .. ($(top-between first and last outgoing)!.5!(top-between outgoing 1 and 2)$) .. (bottom-incoming boundary 1.north);
draw[fill=white] ([out angle=30]a) .. ++(1,.5) .. ++(.5,.6) .. ++(-.25,0) .. ([in angle=30]a);
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=secondtop,
at=(7,0)
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 1,
offset=.5,
cobordism edge/.style=draw,
every outgoing boundary component/.style=transform shape,draw,
fill=gray!50,
name=secondbottom,
at=(secondtop-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .5 with arrowLatex,
mark=at position .5 with node[right] (b);,
,
postaction=decorate
]
(secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between incoming 1 and 2);
draw (secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between last incoming and last outgoing);
draw[dashed] (secondbottom-between last incoming and last outgoing) to[out=45,in=0] (secondbottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
]
([out angle=90]secondbottom-outgoing boundary 1.north) .. (secondbottom-incoming boundary 2.north) .. ($(secondtop-between first and last outgoing)!.5!(secondtop-between outgoing 1 and 2)$) .. (secondbottom-incoming boundary 1.north) .. ([in angle=90]secondbottom-outgoing boundary 1.north);
node at ($(top-outgoing boundary 2.east)!.5!(secondtop-outgoing boundary 1.west)$) (simeq);
endtikzpicture
enddocument
Using the tqft
package:
documentclassarticle
%urlhttps://tex.stackexchange.com/q/481212/86
usepackagetikz
usetikzlibrary
tqft,
decorations.markings,
arrows.meta,
hobby,
calc
begindocument
begintikzpicture[use Hobby shortcut]
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=top
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 0,
cobordism edge/.style=draw,
fill=gray!50,
name=bottom,
at=(top-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
,
postaction=decorate
]
(bottom-between first incoming and last incoming) to[out=45,in=-45] node[pos=.25,right] (b) coordinate[pos=.5] (a) (bottom-between incoming 1 and 2);
draw[dashed] (bottom-between first incoming and last incoming) to[out=135,in=-135] (bottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
] ([closed]$(bottom-between first incoming and last incoming)!.5!(bottom-between incoming 1 and 2)$) .. (bottom-incoming boundary 2.north) .. ($(top-between first and last outgoing)!.5!(top-between outgoing 1 and 2)$) .. (bottom-incoming boundary 1.north);
draw[fill=white] ([out angle=30]a) .. ++(1,.5) .. ++(.5,.6) .. ++(-.25,0) .. ([in angle=30]a);
pic[
scale=2,
tqft,
incoming boundary components = 0,
outgoing boundary components = 2,
cobordism edge/.style=draw,
fill=gray!50,
name=secondtop,
at=(7,0)
];
pic[
scale=2,
tqft,
incoming boundary components = 2,
outgoing boundary components = 1,
offset=.5,
cobordism edge/.style=draw,
every outgoing boundary component/.style=transform shape,draw,
fill=gray!50,
name=secondbottom,
at=(secondtop-outgoing boundary 1)
];
draw[
decoration=
markings,
mark=at position .5 with arrowLatex,
mark=at position .5 with node[right] (b);,
,
postaction=decorate
]
(secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between incoming 1 and 2);
draw (secondbottom-outgoing boundary 1.north) to[out=90,in=-135] (secondbottom-between last incoming and last outgoing);
draw[dashed] (secondbottom-between last incoming and last outgoing) to[out=45,in=0] (secondbottom-between incoming 1 and 2);
draw[
decoration=
markings,
mark=at position .25 with arrowLatex,
mark=at position .25 with node[right] (a);,
,
postaction=decorate
]
([out angle=90]secondbottom-outgoing boundary 1.north) .. (secondbottom-incoming boundary 2.north) .. ($(secondtop-between first and last outgoing)!.5!(secondtop-between outgoing 1 and 2)$) .. (secondbottom-incoming boundary 1.north) .. ([in angle=90]secondbottom-outgoing boundary 1.north);
node at ($(top-outgoing boundary 2.east)!.5!(secondtop-outgoing boundary 1.west)$) (simeq);
endtikzpicture
enddocument
answered yesterday
Loop SpaceLoop Space
113k29307609
113k29307609
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have atext
in an equation and then switch to math mode inside the text,tikzmarknode
does not seem to want to cooporate any more. (next comment)
– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
add a comment |
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have atext
in an equation and then switch to math mode inside the text,tikzmarknode
does not seem to want to cooporate any more. (next comment)
– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have a
text
in an equation and then switch to math mode inside the text, tikzmarknode
does not seem to want to cooporate any more. (next comment)– marmot
4 hours ago
That's great! Didn't know that package even exists. May I bug you with a tikzmark issue? If you have a
text
in an equation and then switch to math mode inside the text, tikzmarknode
does not seem to want to cooporate any more. (next comment)– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
documentclassbeamer usepackagetikz usetikzlibrarytikzmark begindocument beginframe[t] frametitleTest [f(tikzmarknodexx)=x^tikzmarknodealpha1alphaquadtextwith $tikzmarknodealpha2alpha>0$] begintikzpicture[overlay,remember picture] draw[latex-latex] (x) to[bend left] node[midway,above]works (alpha1); draw[latex-latex] (x) to[bend right] node[midway,below]doesn't work (alpha2); endtikzpicture endframe enddocument
– marmot
4 hours ago
add a comment |
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f481212%2fdrawing-a-topological-handle-with-tikz%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown