我怎样才能绘制如下图所示的图形?

我怎样才能绘制如下图所示的图形?

在此处输入图片描述

我正在尝试,但我的 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

  • ... 这也是我们可以方便地挑选出变量的xpartypart的一种方法z。因此,对于s...底部的标签,x@指的xpart是的z@,并y1给出了ypartz1

相关内容