我正在尝试,但我的 LaTeX 代码有问题:
\begin{asy}
pair dynkinMark(real x, real y, string s = "", pen p = defaultpen, pair B = dir(45)) {
if (s != "") { dot("$"+s+"$", (x,y), B, p); }
else { dot((x,y), p); }
return (x,y);
}
dynkinMark(0,1, "1", dir(135));
dynkinMark(0,2, "2", dir(135));
dynkinMark(0,3, "3", dir(135));
dynkinMark(0,4, "4", dir(135));
dynkinMark(7,1, "1'");
dynkinMark(7,2, "2'");
dynkinMark(7,3, "3'");
dynkinMark(7,4, "4'");
path p1 = (0,1)..(2,2.0)..(5,3.5)..(7,4);
path p2 = (0,2)..(2,1.2)..(5,2.5)..(7,3);
path p3 = (0,3)..(2,2.8)..(5,1.5)..(7,1);
path p4 = (0,4)..(2,3.8)..(5,3.5)..(7,2);
draw(p1, blue);
draw(p2, heavycyan);
draw(p3, mediumcyan);
draw(p4, lightblue);
dot("$12$", IP(p1, p2), dir(90), heavygreen);
dot("$13$", IP(p1, p3), dir(90), heavygreen);
dot("$23$", IP(p2, p3), dir(90), heavygreen);
dot("$14$", IP(p1, p4), dir(90), heavygreen);
dot("$24$", IP(p2, p4), dir(90), heavygreen);
real y = 0.8;
label("$s_1$", (IP(p1,p2).x, y), heavygreen);
label("$s_2$", (IP(p1,p3).x, y), heavygreen);
label("$s_1$", (IP(p2,p3).x, y), heavygreen);
label("$s_3$", (IP(p1,p4).x, y), heavygreen);
label("$s_2$", (IP(p2,p4).x, y), heavygreen);
\end{asy}
答案1
事实上 Fallum 的代码已经基本完成了。精确的尺寸、使用intersectionpoint
代替IP
以及最后使用xpart
函数就足够了。
size(10cm);
pair dynkinMark(real x, real y, string s = "", pen p = defaultpen, pair B = dir(45)) {
if (s != "") { dot("$"+s+"$", (x,y), B, p); }
else { dot((x,y), p); }
return (x,y);
}
dynkinMark(0,1, "1", dir(135));
dynkinMark(0,2, "2", dir(135));
dynkinMark(0,3, "3", dir(135));
dynkinMark(0,4, "4", dir(135));
dynkinMark(7,1, "1'");
dynkinMark(7,2, "2'");
dynkinMark(7,3, "3'");
dynkinMark(7,4, "4'");
path p1 = (0,1)..(2,2.0)..(5,3.5)..(7,4);
path p2 = (0,2)..(2,1.2)..(5,2.5)..(7,3);
path p3 = (0,3)..(2,2.8)..(5,1.5)..(7,1);
path p4 = (0,4)..(2,3.8)..(5,3.5)..(7,2);
draw(p1, blue);
draw(p2, heavycyan);
draw(p3, mediumcyan);
draw(p4, lightblue);
dot("$12$", intersectionpoint(p1, p2), dir(90), heavygreen);
dot("$13$", intersectionpoint(p1, p3), dir(90), heavygreen);
dot("$23$", intersectionpoint(p2, p3), dir(90), heavygreen);
dot("$14$", intersectionpoint(p1, p4), dir(90), heavygreen);
dot("$24$", intersectionpoint(p2, p4), dir(90), heavygreen);
real y = 0.8;
label("$s_1$", (xpart(intersectionpoint(p1,p2)), y), heavygreen);
label("$s_2$", (xpart(intersectionpoint(p1,p3)), y), heavygreen);
label("$s_1$", (xpart(intersectionpoint(p2,p3)), y), heavygreen);
label("$s_3$", (xpart(intersectionpoint(p1,p4)), y), heavygreen);
label("$s_2$", (xpart(intersectionpoint(p2,p4)), y), heavygreen);
结果
答案2
暗示:
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{tikzpicture}
\node[fill=black, draw,circle] (a1) at (-7.5,-3.5) {};
\node[fill=black, draw,circle] (a2) at (-7.5,-1) {};
\node[fill=black, draw,circle] (a3) at (-7.5,1) {};
\node[fill=black, draw,circle] (a4) at (-7.5,3) {};
\node[fill=black, draw,circle] (b1) at (7.5,-3.5) {};
\node[fill=black, draw,circle] (b2) at (7.5,-1) {};
\node[fill=black, draw,circle] (b3) at (7.5,1) {};
\node[fill=black, draw,circle] (b4) at (7.5,3) {};
\draw[name path=a1b4] (b4.center) .. controls (2.8,3.4) and (-3,-1.2) .. (a1.center);
\draw[name path=a2b3] (b3.center) .. controls (2.1,0.9) and (-2.3,-5.8) .. (a2.center);
\draw[name path=a3b1] (b1.center) .. controls (3.9,-3.4) and (-2.6,1.5) .. (a3.center);
\draw[name path=a4b2] (b2.center) .. controls (4.1,3.3) and (-0.3,2.3) .. (a4.center);
\path [name intersections={of=a4b2 and a1b4, by=ab14}];
\draw (ab14) node[fill=black, draw,circle,inner sep=3pt,] {}node[above=4pt]{$14$};
\end{tikzpicture}
使用color=purple
内部\draw[]
来为路径着色。自行绘制其他交叉点。
答案3
@CFG 的变体和完成回答(+1):
\documentclass[tikz, margin=6pt]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[
arr/.style = {draw=#1, very thick},
dot/.style = {circle, fill=#1, outer sep=0pt},
dot/.default = black,
]
\foreach \y [count=\i] in {-3.5,-1,1,3}
{
\node[dot, label=left: \i] (a\i) at (-7.5,\y) {};
\node[dot, label=right:\i'] (b\i) at ( 7.5,\y) {};
}
%
\draw[arr=blue, name path=A] (b4) .. controls (2.8, 3.4) and (-3,-1.2) .. (a1);
\draw[arr=teal, name path=B] (b3) .. controls (2.1, 0.9) and (-2.3,-5.8) .. (a2);
\draw[arr=teal!50, name path=C] (b1) .. controls (3.9,-3.4) and (-2.6,1.5) .. (a3);
\draw[arr=blue!50, name path=D] (b2) .. controls (4.1, 3.3) and (-0.3,2.3) .. (a4);
\path [name intersections={of=A and D, by=n14}]
node (s3) [dot=green,label=14] at (n14) {};
\path [name intersections={of=A and B, by=n13}]
node (s2) [dot=green,label=13] at (n13) {};
\path [name intersections={of=A and C, by=n12}]
node (s1)[dot=green,label=12] at (n12) {};
%
\path [name intersections={of=B and C, by=n23}]
node[dot=green,label=23] at (n23) {};
\path [name intersections={of=B and D, by=n24}]
node[dot=green,label=23] at (n23) {};
%
\node [below] at (a1 -| n12) {$s_1$};
\node [below] at (a1 -| n13) {$s_2$};
\node [below] at (a1 -| n14) {$s_1$};
\node [below] at (a1 -| n23) {$s_3$};
\node [below] at (a1 -| n24) {$s_2$};
\end{tikzpicture}
\end{document}
答案4
另一种选择是元帖子. 这包含在luamplib
因此编译中lualatex
。
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
% define a unit for the points
numeric u; u = 1cm;
% define all the points, using the magic z macro and note the ' in suffixes...
z1 = (0, 1u); z1' = (7u, 1u);
z2 = (0, 2u); z2' = (7u, 2u);
z3 = (0, 3u); z3' = (7u, 3u);
z4 = (0, 4u); z4' = (7u, 4u);
z12 = (1u, 1.4u);
z13 = (3u, 2.5u);
z23 = (4u, 2u);
z14 = (5u, 3.6u);
z24 = (6u, 2.9u);
% draw the lines with some nice colours
input colorbrewer
draw z4{20,-1} .. z14 .. z24 .. z2' withcolor Blues 4 4;
draw z3 .. z13 .. z23 .. z1' withcolor Blues 4 2;
draw z2 .. z12 .. z23 .. z24 .. z3' withcolor Greens 4 4;
draw z1 .. z12 .. z13 .. z14 .. z4' withcolor Greens 4 2;
% dot labels on left, and then the right, using "forsuffix" loops...
forsuffixes @=1,2,3,4: dotlabel.ulft("$" & str @ & "$", z@); endfor
forsuffixes @=1',2',3',4': dotlabel.urt("$" & str @ & "$", z@); endfor
% finally mark all the intersections
interim labeloffset := 6; % allow a bit more space
drawoptions(withcolor 3/4 Greens 3 3); % use dark green ink
forsuffixes @=12, 13, 14, 23, 24:
% mark the intersection
dotlabel.top("$" & str @ & "$", z@);
% strip the two numbers from the suffix
numeric a, b;
a = scantokens substring (0,1) of str @;
b = scantokens substring (1,2) of str @;
% add the appropriate label at the bottom
label.bot("$s_" & decimal (b-a) & "$", (x@, y1));
endfor
drawoptions();
endfig;
\end{mplibcode}
\end{document}
笔记
更容易定义确定需要的交叉点,然后绘制通过这些交叉点的路径。但是,您可以反过来做,先定义路径,然后使用它们
intersectionpoint
计算出交叉点。我在用Metapost 色彩酿造师对于颜色。
请注意,您可以
'
在后缀名称中使用请注意,
str suffix
将 asuffix
变成string
。...然后您可以将
string
文字/变量与连接起来&
。最后一个循环展示了如何使用以下方法将字符串重新转换为数字
scantokens
... 这也是我们可以方便地挑选出变量的
xpart
和ypart
的一种方法z
。因此,对于s...
底部的标签,x@
指的xpart
是的z@
,并y1
给出了ypart
的z1
。