Tikz:在某个形状内画一条线

Tikz:在某个形状内画一条线

下图说明了一切。如何才能有效地实现红色虚线?

在此处输入图片描述

下面的丑陋代码是我目前得到的。

\documentclass{article}
\usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
        \draw (-3, -3) grid (5, 5);
        \draw[dashed, color=red] (0+0.1, 0-0.1) -- (1+0.1, 0-0.1) -- (1+0.1, 2-0.1)-- (2+0.1, 2-0.1) -- (2+0.1, 4-0.1) -- (3-0.1, 4-0.1) -- (3-0.1, 1+0.1) -- (2-0.1, 1+0.1) -- (2-0.1, -1+0.1) -- (0+0.1, -1+0.1) -- (0+0.1, 0-0.1);
    \end{tikzpicture}   
\end{document}

答案1

欢迎来到 TeX.SE!是的,你可以简化事情,因为你只需要指定更少的坐标。你的轮廓将归结为

\path[Outline={distance 0.45cm and style {draw=red,dashed}}] 
            (0.05,-0.5) -- ++(1.45,0) -- ++(0,2)
            --++ (1,0) -- ++(0,2.45);

你付出的代价就是你需要做一些准备。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations}
% based on https://tex.stackexchange.com/a/103088/121799
% and https://tex.stackexchange.com/a/423581/121799
\def\pgfdecoratedcontourdistance{0pt}

\pgfkeys{/pgf/decoration/contour distance/.code={%
    \pgfmathparse{#1}%
    \let\pgfdecoratedcontourdistance=\pgfmathresult},%
    /pgf/decoration/contour name/.store in=\ContourName,
    /pgf/decoration/contour name=mycontour
}

\pgfdeclaredecoration{contour lineto}{start}
{
    \state{start}[next state=draw, width=0pt]{
    \pgfcoordinate{\ContourName-0}{\pgfpoint{0pt}{\pgfdecoratedcontourdistance}}
        \pgfpathlineto{\pgfpoint{0pt}{\pgfdecoratedcontourdistance}}%
    }
    \state{draw}[next state=draw, width=\pgfdecoratedinputsegmentlength]{       
        \pgfmathparse{-\pgfdecoratedcontourdistance*cot(-\pgfdecoratedangletonextinputsegment/2+90)}%
        \let\shorten=\pgfmathresult%
        \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength+\shorten}{\pgfdecoratedcontourdistance}}%  
    %\stepcounter{Outline}
    \pgfcoordinate{\ContourName-1}{\pgfpoint{\pgfdecoratedinputsegmentlength+\shorten}{\pgfdecoratedcontourdistance}}
    }
    \state{final}{
        \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength}{\pgfdecoratedcontourdistance}}%
        \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength}{0pt}}
    }   
}
\tikzset{Outline/.style args={distance #1 and style #2}{ postaction={
        decoration={contour lineto, contour distance=-#1,contour name=mycontourA},
        #2,decorate},
        postaction={
        decoration={contour lineto, contour distance=#1,contour name=mycontourB},
        #2,decorate},}}

\begin{document}
    \begin{tikzpicture}
        \draw (-3, -3) grid (5, 5);
        \path[Outline={distance 0.45cm and style {draw=red,dashed}}] 
        (0.05,-0.5) -- ++(1.45,0) -- ++(0,2)
        --++ (1,0) -- ++(0,2.45);
    \end{tikzpicture}   
\end{document}

在此处输入图片描述

相关内容