TikZ로 복잡한 영역 채우기

TikZ로 복잡한 영역 채우기

저는 4개 쌍곡선의 6개 교차점으로 정의되는 복잡한 영역을 채우려고 합니다. 여기에서 볼 수 있듯이:

여기에 이미지 설명을 입력하세요

특히 6개 점으로 경계가 지정되고 정의되는 영역을 채우고 싶습니다. 나는 의 정확한 좌표 p_i와 각 쌍곡선의 정확한 방정식을 알고 있습니다. 어떻게 연결하고 영역을 채울 수 있습니까?

완전성을 기하기 위해 지금까지 가지고 있는 코드는 다음과 같습니다.

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\def\bndmax{5}
\def\bndmin{0.2}
\def\xS{1.5}
\def\gR{1.618034} % The golden ratio

\begin{tikzpicture}
  \draw (-3,-3) grid (3,3);
  \tikzset{func/.style={thick,color=orange!90}}
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{-1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{-1/\x});

  \begin{scope}[shift={(\xS,1/\xS)}]
    \tikzset{func/.style={thick,color=orange!60,dashed}}
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{-1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{-1/\x});
  \end{scope}

  \fill (\xS,1/\xS) circle (2pt);

  \pgfmathsetmacro\x{-\gR*\xS}
  \pgfmathsetmacro\y{1/(\gR*\xS)}
  \coordinate (p1) at (\x,\y);

  \pgfmathsetmacro\x{-(1/\gR)*\xS}
  \pgfmathsetmacro\y{\gR*(1/\xS)}
  \coordinate (p2) at (\x,\y);

  \pgfmathsetmacro\x{1/(\gR*\gR)*\xS}
  \pgfmathsetmacro\y{\gR*\gR/\xS)}
  \coordinate (p3) at (\x,\y);

  \pgfmathsetmacro\x{(1/\gR)*\xS}
  \pgfmathsetmacro\y{-\gR*(1/\xS)}
  \coordinate (p4) at (\x,\y);

  \pgfmathsetmacro\x{\gR*\xS}
  \pgfmathsetmacro\y{-1/(\gR*\xS)}
  \coordinate (p5) at (\x,\y);

  \pgfmathsetmacro\x{\gR*\gR*\xS}
  \pgfmathsetmacro\y{1/(\gR*\gR*\xS)}
  \coordinate (p6) at (\x,\y);

  \foreach \i in {1,2,3,4,5,6}
  \fill[red] (p\i) circle (2pt) node[right]{$p_{\i}$};

\end{tikzpicture}
\end{document}

답변1

완전 자동이 아닌 솔루션은 다음과 같습니다. \xs의 함수 정의에 사용하면 작동하지 않으므로 plot수동으로(따라서 정적으로) 넣어야 했습니다. 각 도메인에 대해 재사용 된 도움말 매크로의 이름을 최대 및 까지 변경하여 \x나중에 \y사용할 \xa\ya있도록 했습니다. 그런 다음 많은 명령을 연결하는 것 뿐입니다 . 이것이 중요합니다. 그렇지 않으면 각 개별 플롯이 닫혀서 이상한 다이아몬드 모양이 됩니다.\xa\xfplot----

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\def\bndmax{5}
\def\bndmin{0.2}
\def\xS{1.5}
\def\gR{1.618034} % The golden ratio

\begin{tikzpicture}
  \draw (-3,-3) grid (3,3);
  \tikzset{func/.style={thick,color=orange!90}}
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{-1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{-1/\x});

  \begin{scope}[shift={(\xS,1/\xS)}]
    \tikzset{func/.style={thick,color=orange!60,dashed}}
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{-1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{-1/\x});
  \end{scope}

  \fill (\xS,1/\xS) circle (2pt);

  \pgfmathsetmacro\xa{-\gR*\xS}
  \pgfmathsetmacro\ya{1/(\gR*\xS)}
  \coordinate (p1) at (\xa,\ya);

  \pgfmathsetmacro\xb{-(1/\gR)*\xS}
  \pgfmathsetmacro\yb{\gR*(1/\xS)}
  \coordinate (p2) at (\xb,\yb);

  \pgfmathsetmacro\xc{1/(\gR*\gR)*\xS}
  \pgfmathsetmacro\yc{\gR*\gR/\xS)}
  \coordinate (p3) at (\xc,\yc);

  \pgfmathsetmacro\xd{(1/\gR)*\xS}
  \pgfmathsetmacro\yd{-\gR*(1/\xS)}
  \coordinate (p4) at (\xd,\yd);

  \pgfmathsetmacro\xe{\gR*\xS}
  \pgfmathsetmacro\ye{-1/(\gR*\xS)}
  \coordinate (p5) at (\xe,\ye);

  \pgfmathsetmacro\xf{\gR*\gR*\xS}
  \pgfmathsetmacro\yf{1/(\gR*\gR*\xS)}
  \coordinate (p6) at (\xf,\yf);

  \foreach \i in {1,2,3,4,5,6}
  \fill[red] (p\i) circle (2pt) node[right]{$p_{\i}$};



  \clip (p1) plot[domain=\xa:\xb] (\x,{-1/\x}) -- plot[domain=\xb:\xc] (\x,{-1/(\x-1.5)+1/1.5}) -- plot[domain=\xc:\xf] (\x,{1/\x}) -- plot[domain=\xf:\xe] (\x,{-1/(\x-1.5)+1/1.5}) -- plot[domain=\xe:\xd] (\x,{-1/\x}) -- plot[domain=\xd:\xa] (\x,{1/(\x-1.5)+1/1.5}) --cycle;
  \fill[opacity=0.3,blue!30!cyan] (\xa,\yd) rectangle (\xf,\yc);

\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요


편집 1:몇 가지 사소한 개선 사항:

  • 그리드를 10x10으로 확장했습니다.
  • 전체적인 클리핑이 개선되었습니다.
  • 모든 기능이 전체 도메인에 그려지도록 경계를 수정했습니다.
  • 배경 레이어에 파란색 채우기를 넣어 기능이나 포인트가 부분적으로 겹치지 않도록 합니다.

.

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}

\pgfdeclarelayer{background layer}
\pgfsetlayers{background layer,main}

\begin{document}

\def\bndmax{6.5}
\def\bndmin{0.15}
\def\xS{1.5}
\def\gR{1.618034} % The golden ratio

\begin{tikzpicture}
    \clip (-5cm-0.2pt,-5cm-0.2pt) rectangle (5cm+0.pt,5cm+0.2pt);
  \draw (-5,-5) grid (5,5);
  \draw[thick] (-5,0) -- (5,0);
  \draw[thick] (0,-5) -- (0,5);
  \tikzset{func/.style={thick,color=orange!90}}
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{-1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{1/\x});
  \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{-1/\x});

  \begin{scope}[shift={(\xS,1/\xS)}]
    \tikzset{func/.style={thick,color=orange!60,dashed}}
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{-1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (\x,{1/\x});
    \draw[func,domain=-\bndmax:-\bndmin] plot [samples=200] (-\x,{-1/\x});
  \end{scope}

  \fill (\xS,1/\xS) circle (2pt);

  \pgfmathsetmacro\xa{-\gR*\xS}
  \pgfmathsetmacro\ya{1/(\gR*\xS)}
  \coordinate (p1) at (\xa,\ya);

  \pgfmathsetmacro\xb{-(1/\gR)*\xS}
  \pgfmathsetmacro\yb{\gR*(1/\xS)}
  \coordinate (p2) at (\xb,\yb);

  \pgfmathsetmacro\xc{1/(\gR*\gR)*\xS}
  \pgfmathsetmacro\yc{\gR*\gR/\xS)}
  \coordinate (p3) at (\xc,\yc);

  \pgfmathsetmacro\xd{(1/\gR)*\xS}
  \pgfmathsetmacro\yd{-\gR*(1/\xS)}
  \coordinate (p4) at (\xd,\yd);

  \pgfmathsetmacro\xe{\gR*\xS}
  \pgfmathsetmacro\ye{-1/(\gR*\xS)}
  \coordinate (p5) at (\xe,\ye);

  \pgfmathsetmacro\xf{\gR*\gR*\xS}
  \pgfmathsetmacro\yf{1/(\gR*\gR*\xS)}
  \coordinate (p6) at (\xf,\yf);

  \foreach \i in {1,2,3,4,5,6}
  \fill[red] (p\i) circle (2pt) node[right]{$p_{\i}$};

  \begin{pgfonlayer}{background layer}
      \clip (p1) plot[domain=\xa:\xb] (\x,{-1/\x}) -- plot[domain=\xb:\xc] (\x,{-1/(\x-1.5)+1/1.5}) -- plot[domain=\xc:\xf] (\x,{1/\x}) -- plot[domain=\xf:\xe] (\x,{-1/(\x-1.5)+1/1.5}) -- plot[domain=\xe:\xd] (\x,{-1/\x}) -- plot[domain=\xd:\xa] (\x,{1/(\x-1.5)+1/1.5}) --cycle;
    \fill[opacity=0.3,blue!30!cyan] (\xa,\yd) rectangle (\xf,\yc);
  \end{pgfonlayer}  

\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

답변2

복잡한 영역의 각 정점 좌표가 있는 동안 단일 경로로 그릴 수 있습니다.

\documentclass{standalone}
\usepackage{tikz}
\def\xS{1.5}
\def\gR{1.618034} % The golden ratio
\begin{document}
\begin{tikzpicture}
  \draw[samples=30,line join=round,fill=lime]
     plot [domain=-\gR*\xS:-(1/\gR)*\xS] (\x,-{1/\x})
  -- plot [domain=-\gR*\xS:-(1/\gR)*\xS] (\x+\xS,{-(1/\x)+(1/\xS)})
  -- plot [domain=1/(\gR*\gR)*\xS:\gR*\gR*\xS] (\x,{1/\x})
  -- plot [domain=\gR*\xS:{(1/\gR)*\xS}] (\x+\xS,{-1/\x+1/\xS})
  -- plot [domain=\gR*\xS:{(1/\gR)*\xS}] (\x,{-1/\x})
  -- plot [domain=-1/(\gR*\gR)*\xS:-\gR*\gR*\xS] (\x+\xS,{1/\x+1/\xS})
  -- cycle;
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

`\xS' 매개변수를 변경할 수도 있습니다:

\begin{tikzpicture}
  \foreach \gray in {10,20,...,90}{
    \pgfmathsetmacro{\xS}{.5+\gray/100*1.5}
    \draw[samples=30,line join=round,draw=black!\gray!yellow]
    plot [domain=-\gR*\xS:-(1/\gR)*\xS] (\x,-{1/\x})
    -- plot [domain=-\gR*\xS:-(1/\gR)*\xS] (\x+\xS,{-(1/\x)+(1/\xS)})
    -- plot [domain=1/(\gR*\gR)*\xS:\gR*\gR*\xS] (\x,{1/\x})
    -- plot [domain=\gR*\xS:{(1/\gR)*\xS}] (\x+\xS,{-1/\x+1/\xS})
    -- plot [domain=\gR*\xS:{(1/\gR)*\xS}] (\x,{-1/\x})
    -- plot [domain=-1/(\gR*\gR)*\xS:-\gR*\gR*\xS] (\x+\xS,{1/\x+1/\xS})
    -- cycle;
  }
\end{tikzpicture}

여기에 이미지 설명을 입력하세요

그러나 좌표를 모르는 경우 연결된 플롯이 있는 두 개의 클립 경로를 사용하는 솔루션이 항상 있습니다(올바르게 선택하면 작동함 \bndmax) \bndmin.

\documentclass{standalone}
\usepackage{tikz}

\def\bndmax{5}
\def\bndmin{0.2}
\def\xS{1.5}
\def\gR{1.618034} % The golden ratio
\begin{document}
\begin{tikzpicture}
  \draw (-\bndmax,-1/\bndmin) grid (\bndmax,1/\bndmin);

  \path[clip] plot [samples=200,domain=-\bndmax:-\bndmin] (-\x,{1/\x})
  -- plot [samples=200,domain=-\bndmin:-\bndmax] (\x,{1/\x})
  -- plot [samples=200,domain=-\bndmax:-\bndmin] (\x,{-1/\x})
  -- plot [samples=200,domain=-\bndmin:-\bndmax] (-\x,{-1/\x})
  -- cycle;

  \fill[green,fill opacity=.3]
  (-\bndmax,-1/\bndmin) rectangle (\bndmax,1/\bndmin);

  \begin{scope}[shift={(\xS,1/\xS)}]
    \path[clip] plot [samples=200,domain=-\bndmax:-\bndmin] (-\x,{1/\x})
    -- plot [samples=200,domain=-\bndmin:-\bndmax] (\x,{1/\x})
    -- plot [samples=200,domain=-\bndmax:-\bndmin] (\x,{-1/\x})
    -- plot [samples=200,domain=-\bndmin:-\bndmax] (-\x,{-1/\x})
    -- cycle;

    \fill[red,fill opacity=.7]
    (-\bndmax,-1/\bndmin) rectangle (\bndmax,1/\bndmin);
  \end{scope}
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

답변3

이를 위해 PGFPlot을 사용할 수 있습니다.

두 가지 함수를 정의했습니다.

declare function={f(\x)=min(1/\x,-1/\x);},
declare function={g(\x)=max(1/\x,-1/\x);}

쌍곡선의 음수(양수) 부분에 해당하고 이를 사용하여 두 개의 새로운 함수를 정의했습니다.

declare function={h(\x)=max(f(x),f(x-1.5)+1/1.5);},
declare function={i(\x)=min(g(x),g(x-1.5)+1/1.5);}

이는 양수(음수) 이동되지 않은 부분과 이동된 부분 중 더 큰(낮은) 부분에 해당합니다.

그런 다음 누적 플롯에서 해당 영역에 색상을 지정하는 데 사용할 수 있습니다. p1과 사이의 부분만 p6색상이 지정되도록 하기 위해 정의되지 않은 좌표가 자동으로 삭제된다는 사실을 활용할 수 있으므로 용어를 추가합니다.

*1/(h(x)<i(x))

이는 관심 영역 외부에서 0으로 나누게 되므로 플롯은 우리가 원하는 곳에서 시작하고 중지됩니다.

\documentclass{article}

\usepackage{pgfplots}

\begin{document}


\begin{tikzpicture}[
    declare function={f(\x)=min(1/\x,-1/\x);},
    declare function={g(\x)=max(1/\x,-1/\x);},
    declare function={h(\x)=max(f(x),f(x-1.5)+1/1.5);},
    declare function={i(\x)=min(g(x),g(x-1.5)+1/1.5);}
]
\begin{axis}[
    domain=-5:5,
    ymin=-5,ymax=5,
    samples=101,
    no markers,
    smooth
]

\addplot [draw=none, stack plots=y] {h(x)*1/(h(x)<i(x))};
\addplot [draw=none, fill=yellow, thick, stack plots=y] {i(x)*1/(h(x)<i(x))- h(x)*1/(h(x)<i(x))}\closedcycle;

\addplot [black] {f(x)};
\addplot [black] {g(x)};

\addplot [black, dashed] {f(x-1.5)+1/1.5};
\addplot [black, dashed] {g(x-1.5)+1/1.5};


\end{axis}
\end{tikzpicture}
\end{document}

답변4

PSTricks와 동등한 제품을 검색하는 사람들을 위한 것입니다.

여기에 이미지 설명을 입력하세요

\documentclass[pstricks,border=0pt]{standalone}
\usepackage{pst-eucl,pst-plot}

\def\f(#1){1 #1 div}
\def\F(#1){\f(#1 1.5 sub) 1 1.5 div add}
\def\g(#1){\f(#1 neg)}
\def\G(#1){\g(#1 1.5 sub) 1 1.5 div add}
\def\x(#1){\psGetNodeCenter{#1}#1.x}

\psset{yMaxValue=4,yMinValue=-4,plotpoints=6001}


\begin{document}

\begin{pspicture}[showgrid=false](-4.25,-4.25)(5.5,4.5)
  \psclip{\psframe[linestyle=none,linewidth=0pt](-4,-4)(5,4)}
    \pstInterFF[PosAngle=135]{\g(x)}{\F(x)}{-2}{P_1}
    \pstInterFF[PosAngle=135]{\g(x)}{\G(x)}{-1}{P_2}
    \pstInterFF[PosAngle=180]{\G(x)}{\f(x)}{1}{P_3}
    \pstInterFF[PosAngle=90]{\G(x)}{\f(x)}{3}{P_4}
    \pstInterFF[PosAngle=-45]{\G(x)}{\g(x)}{2}{P_5}
    \pstInterFF[PosAngle=0]{\g(x)}{\F(x)}{1}{P_6}
    \pscustom*[linecolor=yellow]
    {
        \psplot{\x(P_1)}{\x(P_2)}{\g(x)}
        \psplot{\x(P_2)}{\x(P_3)}{\G(x)}
        \psplot{\x(P_3)}{\x(P_4)}{\f(x)}
        \psplot{\x(P_4)}{\x(P_5)}{\G(x)}
        \psplot{\x(P_5)}{\x(P_6)}{\g(x)}
        \psplot{\x(P_6)}{\x(P_1)}{\F(x)}
    }
    \psplot[linecolor=red]{-4}{5}{\f(x)}
    \psplot[linecolor=blue]{-4}{5}{\g(x)}
    \psset{linestyle=dashed,dash=3pt 1pt}
    \psplot[linecolor=red]{-4}{5}{\F(x)}
    \psplot[linecolor=blue]{-4}{5}{\G(x)}
    \endpsclip
  \psaxes[labelFontSize=\scriptscriptstyle,linecolor=gray]{->}(0,0)(-4,-4)(5,4)[$x$,0][$y$,90]
\end{pspicture}

\end{document}

여기에 이미지 설명을 입력하세요

노트

\psset{saveNodeCoors}
\def\x(#1){N-#1.x}

을 대신하여 사용할 수 있습니다.

\def\x(#1){\psGetNodeCenter{#1}#1.x}

최근 업데이트

편의상 중위 표기법을 사용합니다.

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl,pst-plot}

\def\f(#1){(1/(#1))}
\def\F(#1){(\f(#1-1.5)+1/1.5)}
\def\g(#1){(\f(-(#1)))}
\def\G(#1){(\g(#1-1.5)+1/1.5)}
\def\x(#1){N-#1.x}

\pstVerb{/I2P {exec AlgParser cvx exec} def}

\begin{document}

\begin{pspicture}[showgrid=false,saveNodeCoors,algebraic,yMaxValue=4,yMinValue=-4,plotpoints=6001](-4.25,-4.25)(5.5,4.5)
  \psclip{\psframe[linestyle=none,linewidth=0pt](-4,-4)(5,4)}
    \pstInterFF[PosAngle=135]{{\g(x)} I2P}{{\F(x)} I2P}{-2}{P_1}
    \pstInterFF[PosAngle=135]{{\g(x)} I2P}{{\G(x)} I2P}{-1}{P_2}
    \pstInterFF[PosAngle=180]{{\G(x)} I2P}{{\f(x)} I2P}{1}{P_3}
    \pstInterFF[PosAngle=90]{{\G(x)} I2P}{{\f(x)} I2P}{3}{P_4}
    \pstInterFF[PosAngle=-45]{{\G(x)} I2P}{{\g(x)} I2P}{2}{P_5}
    \pstInterFF[PosAngle=0]{{\g(x)} I2P}{{\F(x)} I2P}{1}{P_6}
    \pscustom*[linecolor=yellow]
    {
        \psplot{\x(P_1)}{\x(P_2)}{\g(x)}
        \psplot{\x(P_2)}{\x(P_3)}{\G(x)}
        \psplot{\x(P_3)}{\x(P_4)}{\f(x)}
        \psplot{\x(P_4)}{\x(P_5)}{\G(x)}
        \psplot{\x(P_5)}{\x(P_6)}{\g(x)}
        \psplot{\x(P_6)}{\x(P_1)}{\F(x)}
    }
    \psplot[linecolor=red]{-4}{5}{\f(x)}
    \psplot[linecolor=blue]{-4}{5}{\g(x)}
    \psset{linestyle=dashed,dash=3pt 1pt}
    \psplot[linecolor=red]{-4}{5}{\F(x)}
    \psplot[linecolor=blue]{-4}{5}{\G(x)}
    \endpsclip
  \psaxes[labelFontSize=\scriptscriptstyle,linecolor=gray]{->}(0,0)(-4,-4)(5,4)[$x$,0][$y$,90]
    \foreach \i in {1,...,6}{\qdisk(P_\i){2pt}}
\end{pspicture}

\end{document}

관련 정보