Включение цветочного узора в треугольники для создания большого додекаэдра

Я пытаюсь сделать трехмерные фигуры (большой додекаэдр, малый звездчатый додекаэдр), для чего до сих пор использовал пакет tikz в латексе. С помощью функций \coordinate и \draw мне удалось сгенерировать точный трафарет для этих моделей.

Теперь вместо того, чтобы делать многогранники, я пытаюсь добавить к нему цветочные узоры, используя только tikz, так как я не силен в скетчинге.

Это импорт изображений jpg (с цветочными узорами) в треугольники, нарисованные с помощью tikz, чтобы сделать трафарет для многогранников, например:

изображение

Я знаю, как импортировать графику в латекс и как делать геометрические узоры с помощью tikz, но не знаю, как «обрезать» файл jpg в треугольник или любой другой многоугольник, координаты которого указаны в tikz.

Например, ниже приведен код, который я использую для создания одной поверхности, содержащей 10 треугольников.

\documentclass{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz,ifthen}
\usetikzlibrary{calc,intersections,patterns}
\usepackage[paper=a4paper,dvips,top=.7cm,left=1.5cm,right=1.5cm, foot=1.2cm,bottom=1cm]{geometry}
\begin{document}
\pagestyle{empty}

\begin{tikzpicture}[scale=0.95,thin,rotate=0]
    \coordinate (O) at (0cm,0cm);

    \coordinate (A) at ($(O) + (36:3cm)$);
    \coordinate (B) at ($(A) + (-36:3cm)$);
    \coordinate (C) at ($(O) + (-36:3cm)$);

    \coordinate (X) at ($(O) + (4.78mm,1.56mm)$);
    \coordinate (Y) at ($(A) + (0mm,-1.9mm)$);
    \coordinate (Z) at ($(B) + (-4.78mm,1.56mm)$);

    \coordinate (X1) at ($(O) + (4.78mm,-1.56mm)$);
    \coordinate (Y1) at ($(O) + (-36:3cm) + (0mm,1.9mm)$);
    \coordinate (Z1) at ($(B) + (-4.78mm,-1.56mm)$);

    \foreach \i in {0,72,...,360}{
    \draw[gray, thin] let \p0=(O), \p1=(A), \p2=(B), \p3=(C) in
        [rotate around={\i:(O)}] (\p2)--(\p1)--(\p0)--(\p2)--(\p3);
    \draw[gray,thin,dashed] let \p1=(X), \p2=(Y), \p3=(Z) in
        [rotate around={\i:(O)}] (\p1)--(\p2)--(\p3)--cycle;
    \draw[gray,thin,dashed] let \p1=(X1), \p2=(Y1), \p3=(Z1) in
        [rotate around={\i:(O)}] (\p1)--(\p2)--(\p3)--cycle;      

    }

    \foreach \density in {20,30,...,160}{
    \foreach \i in {0,72,...,360}{
    \draw[fill=Magenta!\density] let \p1=(X), \p2=(Y), \p3=(Z) in
        [rotate around={\i:(O)}] (\p1)--(\p2)--(\p3)--cycle;
    }
     \path
             (X) coordinate (X1)
          -- (Y) coordinate[pos=.15](X)
          -- (Z) coordinate[pos=.15](Y)
          -- (X1) coordinate[pos=.15](Z);
   }      

\end{tikzpicture}
\end{document}

Это изображение, которое он генерирует: введите здесь описание изображения

Проблема в том, что узор на изображении также генерируется тексом, то, что я хочу, это любой цветочный/не цветочный узор (который я выбираю), могу ли я обрезать внутри треугольника (треугольник находится в каком-то определенном месте на текс-рисунке) .

Любая помощь будет принята с благодарностью.

Спасибо.


person chyle    schedule 12.08.2014    source источник


Ответы (1)


Чтение страниц 1062-1072 Руководства по PGF я написал следующий тестовый код:

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

\begin{document}

\begin{tikzpicture}
\filldraw [red] (0,0) rectangle (4,2);
\pgftext {\pgfimage[interpolate=true,width=1cm,height=1cm]{sample}}
\pgftext[at=\pgfpoint{28mm}{0.8cm},left,base] {\pgfimage[interpolate=true,width=1cm,height=1cm]{sample}}
\end{tikzpicture}

\end{document}

В той же папке, где я сохранил файл .tex с приведенным выше кодом, я также сохранил это изображение как sample.png. Вот скриншот вывода скомпилированного tex:

скриншот вывода

Он показывает эффект позиционирования изображения png с помощью команд \pgftext и \pgfpoint с атрибутами 28mm и 0.8cm или без них.

Пожалуйста, добавьте свой отзыв в комментарий, чтобы мы могли глубже изучить его. Кроме того, добавление вашего кода к вопросу поможет быть более точным!


Дополнение

Вот как я применил идею в своем коде выше к коду, который вы добавили к вопросу:

\documentclass{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz,ifthen}
\usetikzlibrary{calc,intersections,patterns}
\usepackage[paper=a4paper,dvips,top=.7cm,left=1.5cm,right=1.5cm, foot=1.2cm,bottom=1cm]{geometry}
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}[scale=0.95,thin,rotate=0]
  \coordinate (O) at (0cm,0cm);

  \coordinate (A) at ($(O) + (36:3cm)$);
  \coordinate (B) at ($(A) + (-36:3cm)$);
  \coordinate (C) at ($(O) + (-36:3cm)$);

  \coordinate (X) at ($(O) + (4.78mm,1.56mm)$);
  \coordinate (Y) at ($(A) + (0mm,-1.9mm)$);
  \coordinate (Z) at ($(B) + (-4.78mm,1.56mm)$);

  \coordinate (X1) at ($(O) + (4.78mm,-1.56mm)$);
  \coordinate (Y1) at ($(O) + (-36:3cm) + (0mm,1.9mm)$);
  \coordinate (Z1) at ($(B) + (-4.78mm,-1.56mm)$);

  \foreach \i in {0,72,...,360}{
   \draw[gray, thin] let \p0=(O), \p1=(A), \p2=(B), \p3=(C) in
   [rotate around={\i:(O)}] (\p2)--(\p1)--(\p0)--(\p2)--(\p3);
   \draw[gray,thin,dashed] let \p1=(X), \p2=(Y), \p3=(Z) in
   [rotate around={\i:(O)}] (\p1)--(\p2)--(\p3)--cycle;
   \draw[gray,thin,dashed] let \p1=(X1), \p2=(Y1), \p3=(Z1) in
   [rotate around={\i:(O)}] (\p1)--(\p2)--(\p3)--cycle;
  }

  \foreach \density in {20,30,...,160}{
   \path
   (X) coordinate (X1)
   -- (Y) coordinate[pos=.15](X)
   -- (Z) coordinate[pos=.15](Y)
   -- (X1) coordinate[pos=.15](Z);
  }

  % including graphics from external file:
  \foreach \i in {0,72,...,360}{
   \pgftext[at=\pgfpoint{2cm*cos(\i)}{2cm*sin(\i)},left,base,rotate=\i]
   {\pgfimage[interpolate=true,width=1cm,height=1cm]{sample}}
  }
\end{tikzpicture}
\end{document}

Чтобы включить графику из внешнего файла, я выбрал цикл \foreach, но только ради пятикратного использования одного и того же изображения. Ключевым моментом является то, что строка:

\pgftext[at=\pgfpoint{2cm*cos(\i)}{2cm*sin(\i)},left,base,rotate=\i]
{\pgfimage[interpolate=true,width=1cm,height=1cm]{sample}}

должен позволить вам позиционировать внешнюю графику, используя только атрибуты 2cm*cos(\i), 2cm*sin(\i), left, base и rotate=\i.

Вы можете избежать цикла \foreach и использовать один единственный

\pgftext[at=\pgfpoint ... ] {\pgfimage[ ... ]{filename}}

для каждого вашего внешнего файла. Если вы можете создавать прозрачные фоновые изображения для своей треугольной графики, вам может понравиться это решение.

Выход мой:

скриншот вывода 2

person MattAllegro    schedule 28.01.2018
comment
Привет, подскажи как обрезать что-то в треугольник, координаты которого указаны? - person chyle; 29.01.2018
comment
большое спасибо :-) Используя pgfimage и pgftext, которые вы сказали, я могу почти точно позиционировать его. Есть еще некоторые проблемы: (i) в треугольниках есть свободные места, а также (ii) треугольники не начинаются с начала координат. Не могли бы вы дать некоторое представление об этом - я разместил код здесь dropbox.com/sh /ipohw1rzcm6mner/AABMGjKVGEm2ol9NRMjZzNPGa?dl=0 - person chyle; 03.02.2018
comment
@chyle, если я понимаю, что вы имеете в виду, (i) мой ответ может применяться только в том случае, если ваши треугольники pngs или другое расширение с прозрачным фоном, (ii) убедитесь, что это можно решить с помощью или нет атрибутов base и left. - person MattAllegro; 04.02.2018