Рисуем индийский флаг с помощью tikz

Рисуем индийский флаг с помощью tikz

Я пытаюсь нарисовать индийский флаг, используя идеи изздесьи другие, включая символ Ашока-чакры изпример на обороте. Я хочу иметь правильное кодирование с правильными размерами, указанными навикипедия. У меня есть сомнения по поводу размера Ашока-Чакры. Кто-нибудь, помогите мне, пожалуйста! Мой MWE указан ниже:

\documentclass[tikz]{standalone}


\definecolor{saffron}{HTML}{FF9933} % top stripe
\definecolor{white}{HTML}{FFFFFF} % middle stripe
\definecolor{indiegreen}{HTML}{138808} % bottom stripe
\definecolor{navyblue}{HTML}{000080} % ashok chakra

\tikzstyle{bharat}=[draw=navyblue,fill=navyblue]

\begin{document}
\begin{tikzpicture}
    \fill[saffron] (0,400mm) rectangle (900mm,600mm);
    \fill[white] (0,200mm) rectangle (900mm,400mm);
    \fill[indiegreen] (0,0) rectangle (900mm,200mm);
    \node at (450mm,300mm)[scale=0.09]{%
    \begin{tikzpicture}
        \draw[bharat, even odd rule] (0,0) circle (92.5) (0,0) circle (80); 
        \draw[bharat] (0,0) circle (16);
        \foreach \x in {0,..., 23}{
            \draw[bharat] (7.5+15*\x:80) circle (3.5); 
            \draw[bharat, rotate=15*\x] (0,0)--(5.38:32)--(80,0)--(-5.38:32)--cycle; 
        }
    \end{tikzpicture}
    };
\end{tikzpicture}
\end{document}

Вывод выглядит так: введите описание изображения здесь

решение1

Чтобы обеспечить девять различных измерений, можно использовать .is choiceобработчик ключей из pgfkeysstuff. Я переписал код флага (который, вероятно, потребует больше манипуляций, чтобы получить детали Ашока Чакры точно правильно). Обратите внимание, что для больших размеров флага векторы xи yнеобходимо изменить, чтобы избежать dimension too largeошибок:

\documentclass[tikz,border=5]{standalone}
\definecolor{saffron}{HTML}{FF9933}
\definecolor{white}{HTML}{FFFFFF}
\definecolor{indiegreen}{HTML}{138808}
\definecolor{navyblue}{HTML}{000080}
\tikzset{%
  flag width/.store in=\flagwidth,
  flag height/.store in=\flagheight,
  flag size/.style args={#1x#2}{flag width=#1, flag height=#2},
  Ashoka Chakra/.store in=\AshokaChakra,
  size/.is choice,
  size/.cd,
    1/.style={flag size=6300x4200, Ashoka Chakra=1295},
    2/.style={flag size=3600x2400, Ashoka Chakra=740},
    3/.style={flag size=2700x1800, Ashoka Chakra=555},
    4/.style={flag size=1800x1200, Ashoka Chakra=370},
    5/.style={flag size=1350x900, Ashoka Chakra=280},
    6/.style={flag size=900x600, Ashoka Chakra=185},
    7/.style={flag size=450x300, Ashoka Chakra=90},
    8/.style={flag size=225x150, Ashoka Chakra=40},
    9/.style={flag size=150x100, Ashoka Chakra=25},
  /tikz/.cd,
  Flag of India/.pic={%
    \begin{scope}[#1,
    local bounding box/.expanded=\pgfkeysvalueof{/tikz/name prefix}]%
    \foreach \stripecolor [count=\i from 0] in {indiegreen, white, saffron}
      \path [fill=\stripecolor]
      (-\flagwidth/2, \i/3*\flagheight-\flagheight/2)
      rectangle ++(\flagwidth, 1/3*\flagheight);
    \tikzset{scale=\AshokaChakra/2}
    \path [fill=navyblue, even odd rule]
      circle [radius=1] circle [radius=22/25] circle [radius=1/5];
    \foreach \i in {0,...,23}
       \path [fill=navyblue] (15/2+15*\i:22/25) circle [radius=1/20] 
       [rotate=15*\i] (0:0) -- (21/4:1/3) -- (0:7/8)-- (-21/4:1/3)--cycle;
     \end{scope}
 },
 Flag of India/.default={size=9}  
}
\begin{document}
\begin{tikzpicture}[x=1mm, y=1mm]
\coordinate (flag);
\foreach \size in {5,...,9}
  \pic at (flag.south) (flag)
    {Flag of India={size=\size, shift=(270:\flagheight*3/4)}};
\end{tikzpicture}
\end{document}

введите описание изображения здесь

решение2

У вас есть еще проблемы:

  • вставить picв свой собственный tikzpicture- неправильный подход
  • В связи с scaleboxнеобходимостью picиспользования координат, умноженных на обратный коэффициент масштабирования.

введите описание изображения здесь

\documentclass[tikz, border=3mm]{standalone}

\definecolor{saffron}{HTML}{FF9933} % top stripe
\definecolor{white}{HTML}{FFFFFF} % middle stripe
\definecolor{indiegreen}{HTML}{138808} % bottom stripe
\definecolor{navyblue}{HTML}{000080} % ashok chakra


\tikzset{
    estilo/.style = {draw=navyblue,fill=navyblue},% moved here
  ashokchakra/.pic ={
\scalebox{0.1}{
%\begin{tikzpicture} % <-- had to be deleted
    \draw[estilo, even odd rule] (0,0) circle (92.5) (0,0) circle (80);
    \draw[estilo] (0,0) circle (16);
    \foreach \x in {0,..., 23}{
        \draw[estilo] (7.5+15*\x:80) circle (3.5);
        \draw[estilo, rotate=15*\x] (0,0)--(5.38:32)--(80,0)--(-5.38:32)--cycle;
    \node{ \tikzpictext};
    }
%\end{tikzpicture} % <-- had to be deleted
}}}

\begin{document}
\begin{tikzpicture}
    \fill[saffron]      (0,40) rectangle (90,60);
    \fill[white]        (0,20) rectangle (90,40);
    \fill[indiegreen]   (0, 0) rectangle (90,20);
    \pic at (450,300) {ashokchakra};% <-- since you use scalebox
\end{tikzpicture}
\end{document}

Лучший результат вы получите, если не будете использовать scaleboxи вручную масштабировать все координаты в picрисунках:

\documentclass[tikz, border=3mm]{standalone}
\definecolor{saffron}{HTML}{FF9933} % top stripe
\definecolor{white}{HTML}{FFFFFF} % middle stripe
\definecolor{indiegreen}{HTML}{138808} % bottom stripe
\definecolor{navyblue}{HTML}{000080} % ashok chakra

\begin{document}
\begin{tikzpicture}[
    estilo/.style = {draw=navyblue,fill=navyblue},% moved here
  ashokchakra/.pic ={
    \draw[estilo, even odd rule] (0,0) circle (9.25) (0,0) circle (8);
    \draw[estilo] (0,0) circle (1.6);
    \foreach \x in {0,..., 23}
    {
    \draw[estilo] (0.75+15*\x:8.0) circle (0.35);
    \draw[estilo, rotate=15*\x] (0,0)--(0.538:3.2)--(8.0,0)--(-5.38:3.2)--cycle;
    }
    }%end of pic
                ]
    \fill[saffron]      (0,40) rectangle (90,60);
    \fill[white]        (0,20) rectangle (90,40);
    \fill[indiegreen]   (0, 0) rectangle (90,20);
    \pic at (45,30) {ashokchakra};% <-- since you use scalebox
\end{tikzpicture}
\end{document}

В приведенном выше MWE стили ashokchakraперемещены вtikzpicture

введите описание изображения здесь

решение3

Вдохновлено одним из решений здесь, без вложенных tikzpicture' и с небольшим изменением колеса. Масштабируется тоже хорошо.

\documentclass[tikz]{standalone}

\definecolor{kesara}{HTML}{FF9933} % top stripe
\definecolor{madhya}{HTML}{FFFFFF} % middle stripe
\definecolor{harita}{HTML}{138808} % bottom stripe
\definecolor{ashokaneela}{HTML}{000080} % ashok chakra

\usetikzlibrary{calc,fit}
\tikzset{
  bharat/.style={ draw=ashokaneela,fill=ashokaneela }
}

\begin{document}
\begin{tikzpicture}[scale=.9]
  \fill [kesara] (0,400mm) rectangle (900mm,600mm);
  \node (mid) [fit={ (0,200mm) (900mm,400mm) }, rectangle, inner sep=0, fill=madhya] {};
  \fill [harita] (0,0) rectangle (900mm,200mm);
  \fill (mid) [ashokaneela] circle (93mm) ;
  \fill (mid) [white] circle (80mm) ;
  \fill (mid) [ashokaneela] circle (16mm) ;
  \foreach \x in {0,..., 23}{
  \fill [ashokaneela] ($ (mid) + (7.5+15*\x:80mm) $) circle (4mm) ; 
  \fill [ashokaneela, rotate around = {15*\x:(mid)}] 
        ($ (mid) + (10mm,0) $) -- +(26mm,-3mm) -- 
        ($ (mid) + (92mm,0) $) -- +(-56mm,3mm) -- cycle ; 
  }
\end{tikzpicture}
\end{document}

введите описание изображения здесь

Связанный контент