绘制有交叉点的立方体

绘制有交叉点的立方体

我想在 xymatrix 或 tikz 中绘制下图,用交叉点代替虚线箭头。我绘制了这张 tikz,但不知何故无法完成交叉。

任何帮助将不胜感激。

\begin{figure}[hbt]
 \centering
 \scalebox{0.6}
 {
 \begin{tikzpicture}[scale=5]
     \tikzstyle{vertex}=[circle,minimum size=20pt,inner sep=0pt]
     \tikzstyle{selected vertex} = [vertex, fill=blue!24]
     \tikzstyle{selected edge} = [draw,line width=1pt,-,blue!50]
     \tikzstyle{edge} = [draw,line width=3pt,-,white]
     \node[vertex] (v1) at (0,2) {$K(V,0)$};
     \node[vertex] (v2) at (1, 2) {$\binom{V_1}{V}$};
     \node[vertex] (v3) at (0.33, 1.66) {$\binom{V_2}{V}$};
      \node[vertex] (v4) at (0,1) {$\binom{V_3}{V}$};
         \node[vertex] (v5) at (0.33,0.66) {${\begin{psmallmatrix} V_{23}\\
      V_2\oplus V_3\\ V
  \end{psmallmatrix}}$};
     \node[vertex] (v6) at (1,1) {${\begin{psmallmatrix} V_{13}\\
      V_1\oplus V_3\\ V
  \end{psmallmatrix}}$};
     \node[vertex] (v7) at (1.33, 0.66) {${\begin{psmallmatrix} V_{12}\oplus V_{13}\oplus V_{23}\\
      V_1\oplus V_2 \oplus V_3\\ V
  \end{psmallmatrix}}$};
     \node[vertex] (v8) at (1.33, 1.66) {${\begin{psmallmatrix} V_{12}\\
      V_1\oplus V_2\\ V
  \end{psmallmatrix}}$};
         \node[vertex] (v9) at (0.7, 1.8) {$\binom{V_1\oplus V_2}{V}$};
\node[vertex] (v10) at (0.6,1.2) {$\binom{V_1\oplus V_3}{V}$};
\node[vertex] (v11) at (0.17,1.23) {$\binom{V_2\oplus V_3}{V}$};
    
    \draw[-to] (v1) -- (v2);
    \draw[-to] (v1) -- (v3);
    \draw[-to] (v1) -- (v4);
    \draw[-to] (v2) -- (v8);
    %\draw[edge] (v2)--(v6);
    \draw[dashed, -to] (v2) -- (v6);
     \draw[-to] (v3) -- (v8);
     \draw[dashed, -to] (v4) -- (v6);
     \draw[-to] (v4) -- (v5);
     \draw[-to] (v8) -- (v7);
     \draw[-to] (v3) -- (v5);
     \draw[-to] (v5) -- (v7);
     \draw[dashed, -to] (v6) -- (v7);
     \draw[-to] (v2) -- (v9);
     \draw[-to] (v3) -- (v9);
     \draw[->] (v9) -- (v8);
     \draw[dashed,->] (v2) -- (v10);
     \draw[dashed,->] (v4) -- (v10);
     \draw[dashed, ->] (v10) -- (v6);
     \draw[->] (v3) -- (v11);
     \draw[->] (v4) -- (v11);
     \draw[->] (v11) -- (v5);
\end{tikzpicture}
 }
 \end{figure}

在此处输入图片描述

答案1

这是一种方法。如果无法编译代码,我假设您会面临 3 个问题:

  • 节点的结构/位置
  • 节点内容替换
  • 调整

1. 节点的放置

有多种方法可以指定节点坐标,例如:

  • 笛卡尔坐标
  • 极坐标
  • 矩阵(Tikz 中相当于表格)
  • ETC。

我在这里采用矩阵路线。所以我需要做的就是将位置视为行和列。为了更好地跟踪,我在此草图中将节点坐标设为红色,将行和列设为蓝色:

草图

因此Part 1下面的代码就是这样做的:

  • 放置此类节点
  • 通过两种风格将它们联系起来

不要太担心比例和尺寸,因为这些仍然可以调整。请注意我为此目的为 D3 使用的 x-shift。不过,我会将其推迟到最后一步。

\node {\strut}; & & & & & & \\仅用作占位符以提供更多的垂直空间。

展示位置

2. 内容替换(第二部分)

我只是展示了这个过程的开始,在数学模式中替换了一些内容。

为了更好地辅助放置对角节点的错觉,我使外部节点的线条更粗,请参阅样式声明。

如果您不喜欢节点 D2 和 D3 的分离,请将它们写在一行中(即删除多余的一行),然后根据需要应用一些 yshift。

更换已开始

3. 调整

因此,需要进行的主要调整是针对行和列的分隔,并且可能在需要时应用一些移位:

  \matrix[column sep=6mm, row sep=6mm]

建议策略

  • standalone使用类绘制这个立方体
  • 编译它并将其用于主文档中的包\includegraphics中的 pdfgraphicx

代码

\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usepackage{amsmath}

\begin{document}
 % ~~~ developing the structure ~~~~~~~~~
 \begin{tikzpicture}[
    vs/.style={->, dashed},
    >={Stealth},
 ]
 % ~~~ Part 1: placement ~~~~~~~~~~~~~~~~~~~~~~~~
  \matrix[column sep=20mm, row sep=12mm]
  {
    \node (100) {100}; & & & & \node (110) {110}; & & \\
     & & & \node(D1) {D1}; & & \\
     & & \node (101) {101}; & & & & \node (111) {111}; \\
     & &  \node[xshift=9mm] (D3) {D3}; & & &\\
     & \node (D2) {D2}; \\
    \node (000) {000};&  & & & \node (010) {010}; & & \\
    \node {\strut}; & & & & & & \\
     & & \node (001) {001}; & & & & \node (011) {011}; \\
  };
  % ~~~ connections ~~~~~~~~~
  %     top
  \draw[->] (100) -- (110);
  \draw[->] (100) -- (101);
  \draw[->] (101) -- (111);
  \draw[->] (110) -- (111);
    
  %     down
  \draw[->] (100) -- (000);
  \draw[->] (101) -- (001);
  \draw[->] (111) -- (011);
  \draw[vs] (110) -- (010);
  
  %     side
  \draw[->] (000) -- (001);
  \draw[vs] (010) -- (011);
  \draw[->] (101) -- (D2);
  \draw[->] (000) -- (D2);
  \draw[->] (D2) -- (001);
  
  %     bottom
  \draw[vs] (000) -- (010);
  \draw[->] (001) -- (011);
  
  %     diagonals
  \draw[->] (101) -- (D1);
  \draw[->] (110) -- (D1);
  \draw[->] (D1) -- (111);
  \draw[vs] (110) -- (D3);
  \draw[vs] (000) -- (D3);
  \draw[vs] (D3) -- (010);
 \end{tikzpicture}
 
 % ~~~ Part 2: replacements ~~~~~~~~~
 \begin{tikzpicture}[
    vs/.style={->, dashed},
    vt/.style={->, line width=1.5pt},
    >={Stealth},
 ]
 % ~~~ placement ~~~~~~~~~~~~~~~~~~~~~~~~
  \matrix[column sep=6mm, row sep=6mm]
  {
    \node (100) {$K(V,0)$}; & & & & 
    \node (110) {$\binom{V_1}{V}$}; & & \\
     & & & \node(D1) {$\binom{V_1\oplus V_2}{V}$}; & & \\
     & & \node (101) {$\binom{V_2}{V}$}; & & & & & 
     \node (111) {111}; \\
     & &  \node[xshift=9mm] (D3) {D3}; & & &\\
     & \node (D2) {D2}; \\
    \node (000) {000};&  & & & \node (010) {010}; & & \\
    \node {\strut}; & & & & & & \\
     & & \node (001) {001}; & & & & & \node (011) {011}; \\
  };
  % ~~~ connections ~~~~~~~~~
  %     top
  \draw[vt] (100) -- (110);
  \draw[vt] (100) -- (101);
  \draw[vt] (101) -- (111);
  \draw[vt] (110) -- (111);
    
  %     down
  \draw[->] (100) -- (000);
  \draw[->] (101) -- (001);
  \draw[->] (111) -- (011);
  \draw[vs] (110) -- (010);
  
  %     side
  \draw[->] (000) -- (001);
  \draw[vs] (010) -- (011);
  \draw[->] (101) -- (D2);
  \draw[->] (000) -- (D2);
  \draw[->] (D2) -- (001);
  
  %     bottom
  \draw[vs] (000) -- (010);
  \draw[->] (001) -- (011);
  
  %     diagonals
  \draw[->] (101) -- (D1);
  \draw[->] (110) -- (D1);
  \draw[->] (D1) -- (111);
  \draw[vs] (110) -- (D3);
  \draw[vs] (000) -- (D3);
  \draw[vs] (D3) -- (010);
 \end{tikzpicture}  
 
\end{document}

答案2

后续行动我的答案;不用于投票,而是为了使长答案更具可读性。

这是使用简单的方法实现的一种方法Tikz然而,我建议你重新考虑一下你的跨界想法,这只是一种视觉手段,需要付出相当大的努力,而且副作用很大。

基本思想

  • 一旦其他一切都画好了
  • 最后画出交叉路径
  • 所以它们的白色大轮廓覆盖了其余部分
  • 给人一种“穿越”的错觉

这会带来一些问题。我们来看看。

结果

风格

新样式co使用double路径参数,参见 pgfmanual 的第 15 章。

 % ~~~ Part 3: crossing over  ~~~~~~~~~
 \begin{tikzpicture}[
    vs/.style={->, dashed},
    vt/.style={->, line width=1.5pt},
    >={Stealth},
    % to cross over:
    co/.style={
        % double line parameters:   
        draw=white,double=black,line width=3pt,
        double distance=1.5pt,
        % arrow-tip parameters
        -{Stealth[width=10mm,fill=black]}},
 ]

为了更好的可见性,我将右侧的一行改为蓝色。

正如那里描述的:

  • 在这里用白色画一条粗线,包括箭头
  • 画出“正常”线,这里用黑色

相互矛盾的要求需要权衡:

  • 你想要一条粗白线来“覆盖/跨越”其他线
  • 您需要一条细白线以避免其他遮挡物

参见 111 的粗前线:箭头尖端的粗白色轮廓遮住了其他线条,包括尖端。您可以co在一定程度上平衡 -parameters...

绘制最后路径

这里你可以看到几种方法的结合:

  • 首先是顶部的 111 行
  • 第二,节点位置被透支
  • 第三,侧面的蓝线采用不同的方法
  %     crossing over pathes
  %  front, top
  \draw[vt,co] (101) -- (111);
  %  drawing over the placeholder
  \node[fill=white] at (D1) {$\binom{V_1\oplus V_2}{V}$};
  % alternative: draw thick white line AND normal vector
  \draw[draw=white, line width=12pt] (D2) -- (001);
  \draw[->,blue] (D2) -- (001);

我刚才描述了第一个。

第二个会“覆盖”顶部后面的箭头(D1)。两个步骤:

  • 将一个足够大的空节点放入矩阵(接下来是代码)
  • 将第二个节点放在末尾的位置(之前的代码)
%    & & & \node(D1) {$\binom{V_1\oplus V_2}{V}$}; & & \\
%    new: placeholder
     & & & \node[minimum size=10mm] (D1) {}; & & \\

第三个只是绘制了两次连接:

  • 曾经是一条没有箭头的大白线
  • 并作为普通向量
  • 请认出 001 附近的文物

代码

\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usepackage{amsmath}

\begin{document}
 % ~~~ developing the structure ~~~~~~~~~

 % ~~~ Part 3: crossing over  ~~~~~~~~~
 \begin{tikzpicture}[
    vs/.style={->, dashed},
    vt/.style={->, line width=1.5pt},
    >={Stealth},
    % to cross over:
    co/.style={
        % double line parameters:   
        draw=white,double=black,line width=3pt,
        double distance=1.5pt,
        % arrow-tip parameters
        -{Stealth[width=10mm,fill=black]}},
 ]
 % ~~~ placement ~~~~~~~~~~~~~~~~~~~~~~~~
  \matrix[column sep=6mm, row sep=6mm]
  {
    \node (100) {$K(V,0)$}; & & & & 
    \node (110) {$\binom{V_1}{V}$}; & & \\
%    & & & \node(D1) {$\binom{V_1\oplus V_2}{V}$}; & & \\
%    new: placeholder
     & & & \node[minimum size=10mm] (D1) {}; & & \\
     & & \node (101) {$\binom{V_2}{V}$}; & & & & & 
     \node (111) {111}; \\
     & &  \node[xshift=9mm] (D3) {D3}; & & &\\
     & \node (D2) {D2}; \\
    \node (000) {000};&  & & & \node (010) {010}; & & \\
    \node {\strut}; & & & & & & \\
     & & \node (001) {001}; & & & & & \node (011) {011}; \\
  };
  % ~~~ connections ~~~~~~~~~
  %     top
  \draw[vt] (100) -- (110);
  \draw[vt] (100) -- (101);

  \draw[vt] (110) -- (111);    
  %     down
  \draw[->] (100) -- (000);
  \draw[->] (101) -- (001);
  \draw[->] (111) -- (011);
  % highlighting this one: remove the dashed parameter
  \draw[->,blue] (110) -- (010);% <<< new
  
  %     side
  \draw[->] (000) -- (001);
  \draw[vs] (010) -- (011);
  \draw[->] (101) -- (D2);
  \draw[->] (000) -- (D2);
%  \draw[->] (D2) -- (001);
  
  %     bottom
  \draw[vs] (000) -- (010);
  \draw[->] (001) -- (011);
  
  %     diagonals
  \draw[->] (101) -- (D1);
  \draw[->] (110) -- (D1);
  \draw[->] (D1) -- (111);
  \draw[vs] (110) -- (D3);
  \draw[vs] (000) -- (D3);
  \draw[vs] (D3) -- (010);
  
  %     crossing over pathes
  %  front, top
  \draw[vt,co] (101) -- (111);
  %  drawing over the placeholder
  \node[fill=white] at (D1) {$\binom{V_1\oplus V_2}{V}$};
  % alternative: draw thick white line AND normal vector
  \draw[draw=white, line width=12pt] (D2) -- (001);
  \draw[->,blue] (D2) -- (001);

 \end{tikzpicture}  
 
\end{document}

答案3

作为后续行动你的评论,这很不具体,而且这个答案是一个单独的问题。

背景

有多种使用方法Tikz drawings,例如:

  • 直接将代码写入文档(就像你似乎做的那样)
  • 移动Tikz-code到外部文件,\input它(基本上是相同的)
  • 使用包subfiles,允许单独编译每个子文件和主文档
  • 我的建议:使用包graphicx
  • 当然还有更多的方法来实现它

使用主文档中的 Tikz 代码时,您可能错过了transform shape一些选项;请参阅 pgfmanual。

例子

  • 首先使用类在单独的文件中创建并编译你的 Tikz 绘图standalone
  • 第二,将 pdf 作为图形包含进去

要做到这一点:

  • standalone绘画看起来正确
  • 即根据需要调整column seprow sep节点shifts
  • 首先调整以获得平衡的外观

当通过它包含 pdf 时,graphicx它仍然是矢量图形,即您没有像素伪影,除非您的 pdf 查看器引入它们。

结果和代码

假设cubeCross.pdf为独立文件,位于同一目录中,来自类standalone 来自我之前的回答

结果

\documentclass[10pt,a4paper]{article}
\usepackage{graphicx}
\usepackage{lipsum}

\begin{document}
    \lipsum[10]
    
    For including the Tikz-drawing see figure \ref{img}.    
    
 \begin{figure}[!h]
    \includegraphics[width=\textwidth]{cubeCross}
    \caption{Including cubeCross.pdf}\label{img}
 \end{figure}   
    
    \lipsum[11]
\end{document}

相关内容