PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tikz: Fläche füllen mit nodes?!



Barny.G
16-05-2012, 13:22
Hallo und moin moin,

nach einiger Bastelei und immer noch keiner Lösung versuche ich mal das Problem ein wenig breitzutreten. Vielleicht wird es dadurch dünner...

Ich habe mir eine schöne Grafik erstellt und alles möglichst variabel gehalten. Nun möchte ich am unteren Ende gern eine Fläche füllen, deren Ecken durch "nodes" gekennzeichnet sind.

Was mir schon aufgefallen ist, die Fläche ist (an den Linien kann man es sehen) nicht geschlossen. Wahrscheinlich funktioniert es deswegen nicht. Allerdings habe ich noch keine Abhilfe gefunden...

Gern möchte ich direkten Zahlenkontakt vermeiden und auch weiterhin nur mit Variablen arbeiten. Wie kann ich TIKZ dazu verleiten um die nodes nix mehr freizustellen, sondern die "echte" Koordinate unter dem jeweiligen Namen zu speichern?

Hier mein kleines Beispiel:

\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage{graphicx}
\usepackage{float}
%\usepackage{psfrag}
%\usepackage{pstool}

\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{mathrsfs}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc,fit ,intersections}


\begin{document}

\begin{figure}
\beginpgfgraphicnamed{Modell_der_Leitfaehigkeiten}
\begin{center}
\begin{tikzpicture}[scale=1]
\newcommand{\ModBreite}{5}
\newcommand{\CircRad}{2}
%Schichtdicken
\newcommand{\sda}{5}
\newcommand{\sdb}{2}
\newcommand{\sdc}{3}
\newcommand{\sdd}{5}
%Oberflaeche
\coordinate[] (Ovl) at (0,0); %\coordinate[label=left:$vl$]
\coordinate[] (Ohl) at ($(Ovl)+(45:\ModBreite/2)$);
\coordinate[] (Ovr) at ($(Ovl)+(0:\ModBreite)$);
\coordinate[] (Ohr) at ($(Ovr)+(45:\ModBreite/2)$);
%Oberfläche zeichnen
\def \Obfl{(Ovl) -- (Ohl) -- (Ohr) -- (Ovr) -- cycle}
\draw \Obfl;
\fill[color=gray,fill opacity=0.2] \Obfl;
%Sender Tx
\coordinate[label=left:$Tx$] (Tx) at ($(Ovl)+(\ModBreite/2,0)+(45:\ModBreite/4)$);
\fill[red] (Tx) circle (\CircRad pt);
%Empfänger Rx
\coordinate[label=right:$Rx$] (Rx) at ($(Tx)+(\ModBreite/4,-\sda*0.8)$);
\fill[orange] (Rx) circle (\CircRad pt);
%erste Schicht
\draw (Ovl) -- ++(-90:\sda) node[inner sep=0] (Ovlsda){};
\draw (Ohl) -- ++(-90:\sda) node[inner sep=0] (Ohlsda){};
\draw (Ovr) -- ++(-90:\sda) node[inner sep=0] (Ovrsda){};
\draw (Ohr) -- ++(-90:\sda) node[inner sep=0] (Ohrsda){};
\def \ObFlsda{(Ovlsda) -- (Ohlsda) -- (Ohrsda) -- (Ovrsda) -- (Ovlsda)}
\draw[gray, dashed] \ObFlsda;
\fill[color=green,fill opacity=0.1] \ObFlsda; %funktioniert nicht!!!!
%Anschrieb
\draw[latex-] ($(Ovr) + (0,-\sda/2) + (45:\ModBreite/4)$) --++ (-15:\ModBreite/5) node[right]{$\sigma_1$};
\draw ($(Ohr)+(0,-\sda/2)$) node[right]{$h_1$};

%Strahlweg
\draw [-latex,outer sep=2pt] (Tx) -- (Rx);

\end{tikzpicture}
\end{center}
\endpgfgraphicnamed
\end{figure}

\end{document}

Tut mir Leid, aber weniger geht nicht (bei mir) :o

Wenn man schön auf eine untere Ecke zoomt, dann ist gut zu sehen, was ich meine...

Viele Grüße

Thomas

Barny.G
16-05-2012, 13:50
... ich habe eine Lösung gefunden, ob diese jedoch effektiv ist, sei dahin gestellt:

%erste Schicht
\coordinate[] (Ovlsda) at ($(Ovl) + (-90:\sda)$);
\coordinate[] (Ohlsda) at ($(Ohl) + (-90:\sda)$);
\coordinate[] (Ovrsda) at ($(Ovr) + (-90:\sda)$);
\coordinate[] (Ohrsda) at ($(Ohr) + (-90:\sda)$);
\draw (Ovl) -- (Ovlsda);
\draw (Ohl) -- (Ohlsda);
\draw (Ovr) -- (Ovrsda);
\draw (Ohr) -- (Ohrsda);
\def \ObFlsda{(Ovlsda) -- (Ohlsda) -- (Ohrsda) -- (Ovrsda) -- (Ovlsda)}
\draw[gray, dashed] \ObFlsda;
\fill[color=green,fill opacity=0.1] \ObFlsda; %funktioniert nicht!!!!

Somit werden zunächst die Koordinaten berechnet und in einem zweiten Schritt die Linien gezeichnet. Eigentlich wollte ich das in einem Schritt tun, aber ich kann's halt (noch) nicht... :rolleyes:

Hat jemand eine bessere Idee? Sehr gern wäre ich ein bisschen effektiver bei dem Ganzen hier :o

Schöne Grüße

Thomas