기어 체인을 그리는 방법

기어 체인을 그리는 방법

저는 다음과 같이 일련의 기어를 그리고 싶습니다. 여기에 이미지 설명을 입력하세요

Alain Matthes가 제공한 매크로를 사용하고 있습니다.TikZ에서 기어 만들기"이중 기어" 효과(예: 내부/외부 기어)를 얻기 위해 일부 수정을 통해 단일 기어를 그리는 경우.

내 실제 코드는 다음과 같습니다.

\documentclass{standalone}
\usepackage{tikz}

\newcommand{\gear}[5]{%
\foreach \i in {1,...,#1} {%
  [rotate=(\i-1)*360/#1]  (0:#2)  arc (0:#4:#2) {[rounded corners=1.5pt]
             -- (#4+#5:#3)  arc (#4+#5:360/#1-#5:#3)} --  (360/#1:#2)
}}

\begin{document}
  \begin{tikzpicture}
    \matrix[column sep=-0.1cm,draw=none,fill=none,ampersand replacement=\&] {
    %%%%%%%%%%%%%%
    % First gear %
    %%%%%%%%%%%%%%
    \node[circle,minimum size=40mm,fill=gray,shade] at (0,0){};
    \node[circle,minimum size=30mm,fill=white] at (0,0){};
    \draw[thick,rotate=10,fill=gray,shade] \gear{18}{2}{2.2}{10}{2};
    \draw[thick,rotate=22,fill=white] \gear{18}{1.5}{1.7}{6}{1};\&
    %%%%%%%%%%%%%%%
    % Second gear %
    %%%%%%%%%%%%%%%
    \node[circle,minimum size=40mm,fill=gray,shade] at (0,0){};
    \node[circle,minimum size=30mm,fill=white] at (0,0){};
    \draw[thick,rotate=10,fill=gray,shade] \gear{18}{2}{2.2}{10}{2};
    \draw[thick,rotate=22,fill=white] \gear{18}{1.5}{1.7}{6}{1};\\
    };
    \end{tikzpicture}
  \end{document}

이는 다음을 생성합니다.여기에 이미지 설명을 입력하세요

두 번째 기어를 왼쪽/오른쪽으로 이동하려면 기어를 a에 넣었으므로 \matrix매트릭스의 두 번째 셀에 있는 첫 번째 기어의 코드를 복사하고 column sep기어가 원하는 거리에 있도록 지정하면 됩니다. 그러나 이 방법은 다른 column sep.

xshift두 번째 기어를 위/아래로 움직여 시도한 첫 번째 이미지 와 yshift옵션 의 효과를 얻으려면 \draw(이것이 첫 번째 이미지를 얻은 방법입니다) 작업량이 많고 재컴파일도 많이 필요합니다.

그래서 내 질문은: 수동으로 위치를 지정할 필요 없이
기어(코드에 표시된 대로 기어가 2개와 \draw2개의 \node명령으로 구성되는 경우)를 다른 기어에 대해 왼쪽-오른쪽-위-아래로 이동하는 더 좋은 방법이 있습니까? 그것 xshiftyshift?

보다 일반적인 접근 방식

질문을 더 일반화하기 위해 모든 기어가 내부 기어, 배경 등 없이 하나의 기어로만 만들어진 경우를 고려해 보겠습니다. tikzpicture위 코드의 내용은 다음과 같습니다.

\begin{tikzpicture}
    \matrix[column sep=-0.1cm,draw=none,fill=none,ampersand replacement=\&] {
    %%%%%%%%%%%%%%
    % First gear %
    %%%%%%%%%%%%%%
    \draw[thick] \gear{18}{2}{2.2}{10}{2};\&
    %%%%%%%%%%%%%%%
    % Second gear %
    %%%%%%%%%%%%%%%
    \draw[thick] \gear{18}{2}{2.2}{10}{2};\\
    };
  \end{tikzpicture}

여기에 이미지 설명을 입력하세요
첫 번째 이미지처럼 위치를 이동하는 두 개 이상의 기어를 연결하는 방법은 무엇입니까?

답변1

여기에 출발점이 있으며 어떻게 해야 할지에 대한 많은 아이디어 중 하나가 있습니다.입력자료.

스타일 next gear은 다음과 같은 형식으로 주장을 취합니다.

[<opt>:<text>]<abs angle>:<next gear’s radius>

어디

  • :<text>그리고
  • [<opt>:<text>]선택 사항입니다.
  • <abs angle>다음 기어의 절대 각도/방향을 나타냅니다.
  • <next gear’s radius>다음 기어의 반경을 지정합니다.

라이브러리 는 해당 스타일과 매크로 turtle에만 사용됩니다 . 솔직히 말해서, 이것은 라이브러리 없이도 코딩될 수 있었지만, 아 뭐…forward\tikz@lib@turtle@dir

업데이트

자, 새로운 기어( \ngear[<options>](<point>))를 듣고 출력을 시험해 보세요.

기어 조합에는 톱니 수와 같은 약간의 수학이 포함되며, 톱니의 폭과 회전은 이전 기어와 회전에 따라 달라집니다.

\qrr@tikz@do@nextgear@다음 장비에 필요한 계산을 직접 하이재킹하고 삽입할 수 있습니다 .

( TeX.sx에 \ngear이미 정의된 매크로 중 하나에 대한 프런트 엔드 역할을 하도록 재정의할 수도 있습니다 .)\gear

암호

\documentclass[tikz,convert=false]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds,turtle}
\makeatletter
\newcommand*{\gearset}{\pgfqkeys{/gear}}
\newcommand*{\geargetvalue}[1]{\pgfkeysgetvalue{/gear/#1}}
\gearset{
    outer radius/.initial=1cm,
    outer height/.initial=5cm,
    outer width/.initial=.5cm,
    outer number/.initial=10,
    outer rotate/.initial=0,
    inner radius/.initial=,
    inner rotate/.initial=0,
    inner height/.initial=.2cm,
    inner width/.initial=.2cm,
    inner number/.initial=18,
    height/.style={/gear/outer height={#1},/gear/inner height={#1}},
    width/.style={outer width={#1},inner width={#1}},
%   outer outer radius=.4pt, rounded corners?
%   inner outer radius=.2pt,
%   outer inner radius=.4pt,
%   inner inner radius=.2pt,
    /tikz/every gear/.style={draw,fill=none,even odd rule,rounded corners=.5pt},
%   /tikz/every outer gear/.style={top color=blue, bottom color=green},
%   /tikz/every inner gear/.style={draw=blue,fill=white},
}
\newcommand*{\ngear}[1][]{\begingroup\gearset{#1}\ngear@}
\def\ngear@(#1){%
    \geargetvalue{outer radius}\qrr@gear@outerR
    \geargetvalue{inner radius}\qrr@gear@innerR
    \geargetvalue{outer number}\qrr@gear@outerN
    \geargetvalue{inner number}\qrr@gear@innerN
    \geargetvalue{outer height}\qrr@gear@outerH
    \geargetvalue{inner height}\qrr@gear@innerH
    \geargetvalue{outer width}\qrr@gear@outerW
    \geargetvalue{inner width}\qrr@gear@innerW
    \geargetvalue{outer rotate}\qrr@gear@outerRot
    \geargetvalue{inner rotate}\qrr@gear@innerRot
    \pgfmathsetmacro\qrr@gear@ooArc{(\qrr@gear@outerW)/(\qrr@gear@outerR+\qrr@gear@outerH)/pi*180}%
    \pgfmathsetmacro\qrr@gear@ioArc{180/(\qrr@gear@outerN) - \qrr@gear@ooArc}%
    \pgfmathsetmacro\qrr@gear@oiArc{(\qrr@gear@innerW)/(\qrr@gear@innerR+\qrr@gear@innerH)/pi*180}%
    \pgfmathsetmacro\qrr@gear@iiArc{180/(\qrr@gear@innerN) - \qrr@gear@oiArc}%
    \pgfmathtruncatemacro\qrr@gear@outerN{\qrr@gear@outerN-1}%
    \pgfmathtruncatemacro\qrr@gear@innerN{\qrr@gear@innerN-1}%
    \scope[shift={(#1)}]%
    \path[every gear/.try, every outer gear/.try] ({\qrr@gear@outerRot}:{\qrr@gear@outerR+\qrr@gear@outerH})
        \foreach \@tooth in {0,...,\qrr@gear@outerN} {
            \pgfextra
                \pgfmathsetmacro\qrr@gear@sa{\qrr@gear@outerRot+2*\@tooth*(\qrr@gear@ooArc+\qrr@gear@ioArc)}%
            \endpgfextra
            arc[radius={\qrr@gear@outerR+\qrr@gear@outerH}, start angle=\qrr@gear@sa, delta angle=\qrr@gear@ooArc]
            -- (\qrr@gear@sa+\qrr@gear@ooArc:{\qrr@gear@outerR})
            arc[radius={\qrr@gear@outerR}, start angle=\qrr@gear@sa+\qrr@gear@ooArc, delta angle=2*\qrr@gear@ioArc]
            -- (\qrr@gear@sa+\qrr@gear@ooArc+2*\qrr@gear@ioArc:{\qrr@gear@outerR+\qrr@gear@outerH})
            arc[radius={\qrr@gear@outerR+\qrr@gear@outerH}, start angle=\qrr@gear@sa+\qrr@gear@ooArc+2*\qrr@gear@ioArc, delta angle=\qrr@gear@ooArc]
        }
        \ifx\qrr@gear@innerR\pgfutil@empty\else
%       ; % un-comment this and the next line to have two paths
%   \path[every gear/.try, every inner gear]
    (0:{\qrr@gear@innerR-\qrr@gear@innerH})
    \foreach \@tooth in {0,...,\qrr@gear@innerN} {
        \pgfextra
            \pgfmathsetmacro\qrr@gear@sa{\qrr@gear@innerRot+2*\@tooth*(\qrr@gear@oiArc+\qrr@gear@iiArc)}%
        \endpgfextra
        arc[radius={\qrr@gear@innerR-\qrr@gear@innerH}, start angle=\qrr@gear@sa, delta angle=\qrr@gear@oiArc]
        -- (\qrr@gear@sa+\qrr@gear@oiArc:{\qrr@gear@innerR})
        arc[radius={\qrr@gear@innerR}, start angle=\qrr@gear@sa+\qrr@gear@oiArc, delta angle=2*\qrr@gear@iiArc]
        -- (\qrr@gear@sa+\qrr@gear@oiArc+2*\qrr@gear@iiArc:{\qrr@gear@innerR-\qrr@gear@innerH})
        arc[radius={\qrr@gear@innerR-\qrr@gear@innerH}, start angle=\qrr@gear@sa+\qrr@gear@oiArc+2*\qrr@gear@iiArc, delta angle=\qrr@gear@oiArc]
    }
    \fi
    ;
    \endscope
    \endgroup
}
\def\qrr@tikz@gear@current@radius{0pt}
\def\qrr@tikz@do@nextgear{\pgfutil@ifnextchar[\qrr@tikz@do@nextgear@{\qrr@tikz@do@nextgear@[]}}
\def\qrr@tikz@do@nextgear@[#1]#2:#3\@qrr@tikz@do@nextgear{%
    \pgfmathsetmacro\qrr@tikz@gear@distance{\qrr@tikz@gear@current@radius+(#3)+\pgfkeysvalueof{/gear/outer height}}%
    \pgfmathsetmacro\qrr@tikz@gear@current@radius{abs(#3)}%
    \gdef\tikz@lib@turtle@dir{#2}%
    \pgfkeysalso{/tikz/turtle/forward/.expanded=\qrr@tikz@gear@distance pt}
    \pgfgetlastxy\pgf@gear@@x\pgf@gear@@y
    \pgfkeysalso{/tikz/gear={#1, outer radius=\qrr@tikz@gear@current@radius pt}{\pgf@gear@@x,\pgf@gear@@y}}
}
\tikzset{
    gear/.style 2 args={/tikz/insert path={\pgfextra{\ngear[#1](#2)}}},
    turtle/next gear/.code=\qrr@tikz@do@nextgear#1\@qrr@tikz@do@nextgear
}

\begin{document}
\begin{tikzpicture}[show background grid,/gear/height=.3cm,every gear/.append style=thick]
    \draw[dash pattern={on \pgflinewidth off 2\pgflinewidth},thin] (0,0) [turtle={
        next gear/.list={
            0:2cm,
            {[outer rotate=-90,outer width=.18cm,outer number=10]90:2cm},
            {[outer width=.49cm,outer number=14,outer rotate=0]30:3cm},
            {[outer width=.2cm,outer rotate=18]120:2cm}
        }}];
\end{tikzpicture}
\end{document}

산출

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

관련 정보