PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dreieckige Knoten im Baum mit TikZ



Julius
29-05-2012, 22:34
Hallo Community,

Ich versuche gerade mit tikz einen Baum mit dreieckigen Knoten mithilfe der Baum-Vorlage zu gestalten.

Hier ein Minimal-Beispiel:



\documentclass[10pt,a4paper]{article}
\usepackage[english]{babel}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node (root) {-2}
child {node {-5}
child {node[circle,draw] {8}}
child {node {-5}}
}
child {node{-2}
child {node {-2}}
child {node[rectangle,draw] {10}}
};
\end{tikzpicture}
\end{document}


Nun möchte ich, das der oberste ein nach oben zulaufendes Dreieck (maxNode) bildet, die mittleren ein nach unten zulaufendes (minNode) und die untersten wieder ein nach oben zulaufendes Dreieck (maxNode). Es kann aber auch z.B. vorkommen dass in der ersten Ebene (unterhalb der Wurzel) ein minNode und ein maxNode hinkommen sollen.
Anscheinend sind nur Vierecke und Kreise für Knoten vordefiniert.

Eine kleine Skizze wie es aussehen sollte ist hier zu sehen (mit GIMP skizzert):

http://www7.pic-upload.de/thumb/29.05.12/q8exmbks1frc.png (http://www.pic-upload.de/view-14419978/baum.png.html)

Bin über jede Antwort dankbar.

LG Julius

bobmalaria
30-05-2012, 12:25
hi,

hier mal ein ansatz.

ich habe nach triangle im tikz manual gesucht und bin auf die entsprechende form in der shapes.geometric library gestossen.

da hab ich gesehen, dass die spitze des dreieks als 'apex' bezeichnet wird und die mitte unten als 'south'

das musste ich wissen um 'edge from parent path' so anzupassen, dass die verbindungslinien wirklich in die spitze des dreiecks gehen. eine konstante 'sibling angle' von 60grad gibt dir dan insgesamt diesen dreieck-look im gesamten bild.

hoffe es hilft

EDIt: habe gesehen, dass du auch gedrehte dreiecke willst. das geht wohl mit einer option im level style...


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric,trees}

\begin{document}

\begin{tikzpicture}
[level distance=15mm,
every node/.style={fill=red!60,isosceles triangle,shape border
rotate=90,inner sep=1pt},
level 1/.style={sibling distance=20mm,nodes={fill=red!45}},
level 2/.style={sibling distance=20mm,nodes={fill=red!30}},
level 3/.style={sibling distance=20mm,nodes={fill=red!25}},
sibling angle=60,
edge from parent path= {(\tikzparentnode.south) -- (\tikzchildnode.apex)}
]
\node {31}
child {node {30}
child {node {20}
child {node {5}}
child {node {4}}
}
child {node {10}
child {node {9}}
child {node {1}}
}
}
child {node {20}
child {node {19}
child {node {1}}
child[missing]
}
child {node {18}}
};
\end{tikzpicture}

\end{document}


http://www.mrunix.de/forums/attachment.php?attachmentid=5238&stc=1&d=1338373539

EDIT:

mit gedrehten nodes wird es haesslich :) da kann man eventuell einen eigenen style definieren um die code menge zu reduzieren.


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric,trees}

\begin{document}

\begin{tikzpicture}
[level distance=15mm,
every node/.style={fill=red!60,isosceles triangle,inner sep=1pt},
level 1/.style={sibling distance=20mm,nodes={fill=red!45},shape border
rotate=-90},
level 2/.style={sibling distance=20mm,nodes={fill=red!30},shape border
rotate=90},
level 3/.style={sibling distance=20mm,nodes={fill=red!25},shape border
rotate=90},
sibling angle=60,
%edge from parent path= {(\tikzparentnode.south) -- (\tikzchildnode.apex)}
]
\node[shape border rotate=90] {31}
child {node {30}
child {node {20} edge from parent[edge from parent path=
{(\tikzparentnode.apex) -- (\tikzchildnode.apex)}]
child {node {5} edge from parent[edge from parent path=
{(\tikzparentnode.south) -- (\tikzchildnode.apex)}]}
child {node {4}edge from parent[edge from parent path=
{(\tikzparentnode.south) -- (\tikzchildnode.apex)}]}
}
child {node {10} edge from parent[edge from parent path=
{(\tikzparentnode.south) -- (\tikzchildnode.apex)}]
child {node {9}}
child {node {1}}
}
}
child {node {20}
child {node {19} edge from parent[edge from parent path=
{(\tikzparentnode.apex) -- (\tikzchildnode.apex)}]
child {node {1}edge from parent[edge from parent path=
{(\tikzparentnode.south) -- (\tikzchildnode.apex)}]}
child[missing]
}
child {node {18} edge from parent[edge from parent path=
{(\tikzparentnode.apex) -- (\tikzchildnode.apex)}]}
};
\end{tikzpicture}

\end{document}


http://www.mrunix.de/forums/attachment.php?attachmentid=5239&stc=1&d=1338375151

Julius
30-05-2012, 13:52
Hallo bobmalaria,


hi,
ich habe nach triangle im tikz manual gesucht und bin auf die entsprechende form in der shapes.geometric library gestossen.

da hab ich gesehen, dass die spitze des dreieks als 'apex' bezeichnet wird und die mitte unten als 'south'


da hab ich auch herumgewühlt, aber anscheinend habe ich die beiden Bezeichnungen übersehen.

Ich habe mich jetzt mit deinem Code auseinandergesetzt und ihn, mit ein paar Änderungen für mein Design, umsetzen können.

Es funktioniert prima! Die ganze Löung ist zwar ein bissl umständlich, aber erfült ihren Zweck. Die sibling distance musste ich auch noch anpassen, da sonst Kinder übereinanderliegen, das hatte ich in meinem Minimalbeispiel aber auch nicht beachtet...

Also vielen vielen Dank für deine Mühe!

LG Julius