Materiały z ćwiczeń – 5–6 maja 2015 r 1. Funkcja foreach
Transkrypt
Materiały z ćwiczeń – 5–6 maja 2015 r 1. Funkcja foreach
Materiały z ćwiczeń – 5–6 maja 2015 r Zofia Walczak 1. Funkcja foreach \begin{tikzpicture} \draw (0,0) -- (6,0); \fill (0,0) circle (2pt); \foreach \x in {1,2,3,4,5} \draw (\x,0) circle(2pt); %\fill circle (2pt); \end{tikzpicture} \begin{tikzpicture} \draw[->] (0,0) -- (0,8); \draw[->] (0,0) -- (8,0); \fill (0,0) circle(2pt); \foreach \x in {1,2,3,4,5,6,7} \draw (\x,0) +(0,.1)-- ++(0,-.1); \foreach \y in {1,2,3,4,5,6,7} \draw (0,\y) +(-.1,0)-- ++(.1,0); \foreach \x in {1,2,3,4,5,6,7} \foreach \y in {1,2,3,4,5,6,7} \draw[fill] (\x,\y) circle(2pt); \foreach \x in {.5,1.5,2.5,3.5,4.5,5.5,6.5} \foreach \y in {.5,1.5,2.5,3.5,4.5,5.5,6.5} \draw (\x,\y) circle(1pt); \draw[line width=2pt] (3,2)-- (5,6); \end{tikzpicture} 1 2. Wypełnianie ścieżki kolorem Do wypełniania ścieżki kolorem służy polecenie \fill=<kolor>. Jeśli użyjemy tego polecenia to najpierw ścieżka zostanie domknięta (jeśli będzie to konieczne) a następnie jej wnętrze będzie wypełnione kolorem. Jeżeli wypełniany obszar składa się z kilku innych obszarów zamkniętych, wtedy należy skorzystać z jednej z dwóch istniejących zasad wypełniania: nonzero rule i even odd rule. \filldraw(0,0)--(4,-1)--(2,3)--(0,0) (4,4)--(3,-2)--(1,-2)--(4,4); \filldraw(0,0)--(4,-1)--(2,3)--(0,0) (4,4)--(1,-2)--(3,-2)--(4,4); \filldraw[even odd rule] (0,0)--(4,-1)--(2,3)--(0,0) (4,4)--(1,-2)--(3,-2)--(4,4); \filldraw[even odd rule] (0,0)--(4,-1)--(2,3)--(0,0) (4,4)--(3,-2)--(1,-2)--(4,4); 2 \fill(0,0)--(4,0)--(2,3)--cycle (0,2)--(4,2)--(2,-1)--cycle; \filldraw[even odd rule](0,0)--(4,0)--(2,3)--cycle (0,2)--(4,2)--(2,-1)--cycle (1,1) circle(1cm); \filldraw(0,0)--(4,0)--(2,3)--cycle (0,2)--(4,2)--(2,-1)--cycle (1,1) circle(1cm); Wypełnianie kolorem ścieżek przecinających się lub zbudowanych z kilku obszarów zamkniętych jest bardziej skomplikowane, gdyż trudno jest wyspecyfikować poszczególne części rysunku. Pomocne mogą być operacje nonzero rule i even odd rule. Zastosowanie ich pozwala stwierdzić czy punkt leży wewnątrz czy na zewnątrz obszaru który chcemy wypełnić. Jeżeli opcja nonzero rule jest aktywna to do stwierdzenia czy dany punkt A leży wewnątrz czy na zewnątrz ścieżki stosowana jest następująca metoda: – Z punktu A prowadzimy promień tak by przecinał ścieżkę – być może kilkakrotnie. Jeśli w punkcie przecięcia ścieżka biegnie od „lewej do prawej” (względem promienia) wówczas licznik którego wartość początkowa jest równa zero jest zwiększany o 1, w przeciwnym przypadku jest zmniejszany o 1. Na koniec jest sprawdzana wartość licznika. Jeśli jest równy zero wówczas punkt A leży na zewnątrz ścieżki, jeśli jest różny od zera, punkt A leży wewnątrz. Jeżeli opcja even odd rule jest aktywna inna metoda jest stosowana. Tak samo jak poprzednio z punktu A prowadzimy promień przecinający ścieżkę. Liczymy ile razy promień ją przetnie i mówimy, że punkt leży wewnątrz ścieżki jeśli liczba jest nieparzysta, w przeciwnym wypadku punkt leży na zewnątrz ścieżki. 3. Środowisko scope i instrukcja \clip Środowisko tikzpicture może przyjmować parametry graficzne (opcje) wpisane w miejscu argumentu opcje. Dotyczą one wtedy wszystkich poleceń, które tworzą rysunek. Jeśli jednak chcielibyśmy zastosować parametry graficzne do lokalnej grupy poleceń, to należy użyć środowiska grupującego scope. Jest ono 3 dostępne tylko wewnątrz środowiska tikzpicture i wywołujemy je w następujący sposób (w LATEX’u): \begin{scope}[opcje] zawartość środowiska \end{scope} Środowisko scope pobiera parametry graficzne jako opcjonalny argument opcje i stosuje je do wszystkich elementów środowiska. Żadne polecenie występujące poza środowiskiem scope nie ma dostępu do tych opcji. Parametry graficzne określone dla poszczególnych poleceń mogą nadpisywać te ustalone dla całego obszaru. \begin{tikzpicture}[red,line width=4pt] \begin{scope}[yellow,line width=2pt] \draw (0,3) -- (2,3) (0,3.5) -- (2,3.5); \end{scope} \draw (0,2) -- (2,2) (0,2.5) -- (2,2.5); \begin{scope}[green,line width=6pt] \draw (0,1) -- (2,1) (0,1.5) -- (2,1.5); \draw[blue] (0,0.5)--(2,0.5) (0,0)--(2,0); \end{scope} \end{tikzpicture} Wycinanie części rysunku (ścieżki) realizujemy poleceniem \clip. Jego składnia jest następująca \clip <specyfikacja ścieżki> Zastosowanie tej instrukcji spowoduje narysowanie tylko tej części rysunku, która znajduje się wewnątrz ścieżki podanej w argumencie <specyfikacja ścieżki>. Poniższy przykład pokazuje którą część i z jakiego rysunku (obrazka) będziemy wycinać, \begin{tikzpicture} \draw[dashed] (225:1.45cm) rectangle +(45:2.9cm); \draw (0,0) circle (2cm); \draw (0:1cm) circle (1cm) (90:1cm) circle (1cm) (180:1cm) circle (1cm) (270:1cm) circle (1cm); \end{tikzpicture} a kolejny tą wyciętą część. 4 \begin{tikzpicture} \clip (225:1.45cm) rectangle +(45:2.9cm); \draw (0,0) circle (2cm); \draw (0:1cm) circle (1cm) (90:1cm) circle (1cm) (180:1cm) circle (1cm) (270:1cm) circle (1cm); \end{tikzpicture} Polecenie \clip zastosowane do rysunku zawsze obejmuje wszystkie polecenia, które go konstruują. Jeżeli chcielibyśmy, by widoczny był cały rysunek wraz z wycinanym fragmentem wówczas warto wykorzystać możliwości środowiska scope. Zmiany wprowadzane wscope są lokalne i żadne zastosowane tam parametry graficzne nie zadziałają poza nim. Jeśli użyjemy \clip, gdziekolwiek wewnątrz scope, efekt polecenia zakończy się wraz z zakończeniem środowiska. Tym samym zapobiegamy „rozszerzaniu” wycinanego obszaru na inne obiekty. Narysować B A C W powyższym przykładzie wycinanie zostało zastosowane wielokrotnie, dzięki czemu łatwo można uzyskać część wspólną zbiorów. Kolejność rysowania była następująca: najpierw wewnątrz środowiska scope umieściliśmy instrukcje rysujące część wspólną trzech kół \begin{scope} \clip (0,0) circle (1.5cm); 5 \clip (60:2cm) circle (1.5cm); \fill[gray] (0:2cm) circle (1.5cm); \end{scope} a następnie te koła narysowaliśmy \draw (0,0) node[below]{A} circle (1.5cm); \draw (60:2cm) node[above]{B} circle (1.5cm); \draw (0:2cm) node[below]{C} circle (1.5cm); W przypadku różnicy zbiorów trzeba zastosować pewną sztuczkę. Polega ona na tym by dodać duży prostokąt, który obejmie cały rysunek, wyciąć go wraz ze zbiorem, który nie może znaleźć się w różnicy, a następnie wypełnić poszukiwany zbiór i użyć opcję even odd rule. Wynik widać na poniższym przykładzie. B A 6