Tikz: Bestimmte Abschnitte einfärben und Punkte auf Rändern

Tabellen und Grafiken erstellen und anordnen


guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Tikz: Bestimmte Abschnitte einfärben und Punkte auf Rändern

Beitrag von guy.brush™ »

Hallo,

dieser Thread beschäftigt sich mit einem 2. großen Problem, das ich aktuell noch mit tikz habe, weshalb ich es von meinem ersten Problem getrennt habe und einen extra Thread aufmache.

Eigentlich sind es 2 Probleme, aber damit ich mit meiner Behauptung "2. Problem" "recht" behalte, nennen wir sie "Problem 2a" und "Problem 2b" :D.


Problem 2a:

Wie färbe ich bestimmte Gebiete in einer gewünschten Farbe ein, wobei sich die bestimmten Gebiete meist durch bestimmte (geometrische) Zeichnungen ergeben? Ich habe einmal ein Beispiel (siehe unten) dazu gemacht. Wie kann ich z.B. die 3 Flächen, in die ich das Dreieck eingeteilt habe, in 3 verschiebene Farben einfärben?

Dabei ist zu beachten, dass hier das ganze quasi mit 3 Strichen ("Bleistift ansetzen ohne absetzen" = 1 Strich) gezeichnet werden kann, was recht einfach ist. Das muss aber nicht zwangsläufig so sein.


Problem 2b:

Wie spreche ich einen beliebigen, d.h. einen meiner Wahl, Punkt auf dem Rand eines Gebildes an, um dort z.B. einen Punkt (also einen kleinen ausgefüllten Kreis) zu malen, eine Linie durchzuzeichnen oder eine Strecke zwischen 2 Randpunkten zu zeichnen? Ein Gebilde kann dabei ein beliebiges Objekt sein, also z.B. ein Kreis, eine Kartoffelmenge (siehe mein erster Thread, Link oben), ein Dreieck oder theoretisch auch ein 42-dimensionaler Würfel :).


Hier mein Beispiel: [Im Anhang wieder der Output als .pdf.]
\documentclass[a4paper,%
	       11pt,%
	       DIV=10,%
	       BCOR=0mm,%
	       twoside=semi,%
	       footnotes=multiple]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[intlimits]{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsopn}
\usepackage{amsthm}
\usepackage{mathtools}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    % Dreieck
    \draw (-5,0) -- (5,0) -- (0,7.42) -- cycle;
    
    % komisches Gewirr im inneren des Dreiecks
    % Ist die Formatierung im Folgenden so in Ordnung oder kann das zu Problemen führen?
    \draw (0,7.42) -- (0,6)
		   -- (-1,5.5)
		   -- (0.1,4.2)
		   -- (0.1,2.1)
		   -- (2.1,2.1)
		   -- (3,2.5)
		   -- (2,1.7)
		   -- (2,1)
		   -- (0,0.5)
		   -- (0,0);
    % horizontaler Strich im komisches Gewirr
    \draw (2,1.7) -- (4.2,1.7);	% dieser Strich geht über das Dreieck hinaus, weil ich nicht weiß, wie ich tikz,
				% dass er "bei der Kollision" mit dem Rand aufhören soll zu zeichnen :)
				% (siehe 2. Frage)
  \end{tikzpicture}
  \caption{Kurioses Dreieck}
  \label{fig:kurioses_dreieck}
\end{figure}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    % Kreis
    \draw (0,0) circle (4.2);  
  \end{tikzpicture}
  \caption{Kreis}
  \label{fig:kreis}
\end{figure}

\end{document}

Zusatzfrage: In welcher Größe ist es sinnvoll, einen Punkt zu malen? Also z.B. ein Kreismittelpunkt, und einen auf dem Kreisrand, die man dann z.B. M und P nennt.

Zusatzfrage 2: Welche Einheit verwendet tikz, wenn ich keine Einheit angebe? Für mich sieht das irgendwie sehr nach cm aus.


So, das wären erst einmal meine 2 größten Probleme. Ich hoffe, ihr könnt mir helfen, da wäre ich euch sehr dankbar :).

Am Ende möchte ich sogar beide Probleme (1, 2a und 2b) kombinieren, indem ich eine Kartoffel zeichne, 2 Randpunkte auswähle, eine "Unterkartoffel" am Rand der ersten Kartoffelmenge zeichne und diese einfärbe :).


Viele Grüße,

\\ guy.brush
Dateianhänge
Flaechen_fuellen_und_Punkte_auf_Raendern.pdf
(16.23 KiB) 535-mal heruntergeladen
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Hab grad nicht so viel Zeit, daher nur kurz: Schau dir mal die intersections Library an zu Problem 2a, vielleicht auch 2b. Zu 2b könnte evtl. auch die Angabe von Koordinaten mit der calc Library nützlich sei: ($(A)!0.5!(B)$) = auf halber Strecke zwischen Koordinate (A) und (B)

Tobi

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Vielen dank schon einmal :).

Ich muss zugeben, dass ich intersections noch nicht so ganz verstanden habe, sieht etwas komplizierter aus (auch von der Syntax).

Die calc Library hingegen sieht sehr nützlich aus. So kann ich zumindest bei einem Kreis einen Punkt auf den Rand setzen. Bei einem Dreieck oder gar Kartoffelmengen bin ich aber noch etwas aufgeschmissen :).

calc dürfte aber auch bei der Konstruktion von Halbgeraden helfen, vielleicht sogar auch bei Tangenten und bei Geraden durch 2 Punkten. Mal schauen. Das sind quasi weiterführende Problematiken, die sich aus Problem 2b ergeben (werden).

Zu Problem 2a hatte ich auch etwas bzgl. clipping gelesen, aber das ist auch noch nicht so ganz durchgedrungen bei mir :).
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

So, ich müsste doch noch einmal nachfragen. calc und intersection ... denke ich zumindest ... dürfte ich verstanden haben. Zumindest das, was im manual bzgl. tikz-Code und nicht pgf-Code steht.

Bezüglich Punkten auf dem Rand von Objekten muss man, so denke ich, eine unsichtbare Gerade mit \path (und nicht mit \draw) zeichnen und dann die Schnittpunkte berechnen (lassen). Ich hoffe, dass das so geht. Ein expliziter Test konnte zwecks Zeitmangels noch nicht durchgeführt werden :).

Was ich mir aber noch nicht vorstellen kann, ist, wie ich jetzt so etwas einfärben könnte. Die clip-Funktion habe ich noch nicht wirklich verstanden.


Ein weiteres Problem, was ich nicht wüsste, wie ich es realisieren sollte, ist das Bild (Torus = Donut) aus dem Anhang. Es geht hier insb. um die 2 Kreissegmente in der Mitte, die sich ja um die "Mittelachse" der Ellipse herum befinden sollten und der obere, kleinere Segment muss genau von dem einen Punkt auf dem anderen Segment bis zu dem anderen gehen. Ich hoffe, du/ihr versteh(s)t, was ich meine :).

Das 2. Bildchen ist die Kugel, die etwas 3D mäßig wirken sollte. Die fortgeschrittene Version von dieser Fassung wäre, dass der Kreisrand vorne durchgezogene ist (solid) und die hintere gepunktet oder gestrichelt (dashed).

Die Bildchen sind nur fix gezeichnet mit Inkscape, mit tikz wäre etwas genauer schon schöner ;).


Wäre für Hilfe sehr dankbar :).


Viele Grüße,

\\ guy.brush
Dateianhänge
Donut, Kugel Schritt 1 und Kugel Entfassung
Donut, Kugel Schritt 1 und Kugel Entfassung
Donut und Kugeln.png (37.59 KiB) 2879 mal betrachtet
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Hallo,

ich schreibe einfach einmal tapfer weiter, vielleicht liest es ja einmal jemand, der mir weiterhelfen kann :).

Ich mache in Zwischenzeit ein paar Fortschritte :).

Ich bin jetzt in der Lage, das oben erwähnte Dreieck nach eigenen Wünschen einzufärben.

Aktuell versuche ich, die 3D-wirkende Kugel zu zeichnen, die ich im Post vor diesem hier als Bild angehängt habe. Dabei bin ich auf ein Problem gestoßen, das ich aktuell mit meinen Mitteln nicht mehr lösen kann:

Und zwar benötige ich einen berechneten Radius, um die oberen und unteren Ellipsen erzeugen zu können. Ich konnte schon die Schnittpunkte auf dem Kreisrand bestimmen, aber jetzt stehe ich vor dem Problem, dass die "path midway construction" aus dem calc-Paket einen Punkt ausspuckt, ich aber nur die horizontale Differenz der beiden Punkte benötige.
\documentclass[a4paper,%
	       11pt,%
	       DIV=10,%
	       BCOR=0mm,%
	       twoside=semi,%
	       footnotes=multiple]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{matrix,arrows,intersections,calc}

\begin{document}


\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    % Kreis
    \draw[name path = kreis] (0,0) circle [radius=2];
    \draw (0,0) ellipse [x radius=2, y radius=0.5];
    \draw[name path=untere linie] (-3,-1.25) -- (3,-1.25);
    \path[name intersections={of=kreis and untere linie, name=unten}];
%     \draw (unten-2) arc [x radius=1.5, y radius=0.5, start angle=0, end angle=180];
    \draw ($(unten-1)!0.5!(unten-2)$) ellipse [x radius=($(unten-1)!0.5!(unten-2)$), y radius=0.42];
  \end{tikzpicture}
  \caption{Kreis}
  \label{fig:kreis}
\end{figure}

\begin{tikzpicture}
  \draw[name path=foo] (0,0) circle [radius=2];
  \draw[name path=bar] (-3,-3) -- (3,3);
  \fill[red, name intersections={of= foo and bar, name=foobar}]
    (foobar-1) circle [radius=0.05]
    (foobar-2) circle [radius=0.05];
  \draw ($(foobar-1)!0.5!90:(foobar-2)$) -- ($(foobar-1)!0.5!270:(foobar-2)$);
\end{tikzpicture}

\end{document}
So geht das Kompilieren leider schief :(. [Den "y radius" muss ich dann wohl per Hand so lange anpassen, bis es gut aussieht.]


Meine zweite Frage bezieht sich auf die zweite tikzpicture-Umgebung in diesem Beispiel. Und zwar habe ich das Problem, dass ich auf die Koordinaten (foobar-1) und (foobar-2) erst nach dem Ausführen der intersection zugreifen kann. Das bedeutet aber, das die von mir hier schön konstruierte Tangente im Code nach der Definition und dem Erzeugen der roten Kreise kommt und demnach liegt die Tangete auf dem roten Kreis.

Ok, ich kann jetzt hergehen und im Teil mit "name intersections={...}" die roten Kreise noch nicht erzeugen und erst nach dem Zeichnen der (in diesem Fall) Tangente. Meine Frage jetzt: Geht das auch eleganter, indem ich die Reihenfolge so belasse, wie sie bei mir oben im Code ist, aber eine Option angebe, so dass die roten Kreise "oben" sein werden?
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

Hagbard Celine
Forum-Century
Forum-Century
Beiträge: 152
Registriert: Mi 23. Feb 2011, 22:13
Wohnort: Halle (Saale)

Beitrag von Hagbard Celine »

guy.brush hat geschrieben:Geht das auch eleganter, indem ich die Reihenfolge so belasse, wie sie bei mir oben im Code ist, aber eine Option angebe, so dass die roten Kreise "oben" sein werden?
Ja, geht es. Dafür gibt es die TikZ-Library backgrounds und eine zugehörige Umgebung (siehe Quelltext).
\documentclass[a4paper,%
          11pt,%
          DIV=10,%
          BCOR=0mm,%
          twoside=semi,%
          footnotes=multiple]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{matrix,arrows,intersections,calc}

\usetikzlibrary{backgrounds} % diese Library einbinden

\begin{document}

\begin{tikzpicture}
  \draw[name path=foo] (0,0) circle [radius=2];
  \draw[name path=bar] (-3,-3) -- (3,3);
  \fill[red, name intersections={of= foo and bar, name=foobar}]
    (foobar-1) circle [radius=0.05]
    (foobar-2) circle [radius=0.05];
  \begin{pgfonlayer}{background} % Tangente in den Hintergrund rücken
	  \draw ($(foobar-1)!0.5!90:(foobar-2)$) -- ($(foobar-1)!0.5!270:(foobar-2)$);
  \end{pgfonlayer}  
\end{tikzpicture}

\end{document}
 

guy.brush

Beitrag von guy.brush »

Vielen Dank :). Es scheint auch ein "foreground" und ein "main" zu geben. Muss ich einmal genauer anschauen.

Ich bin bzgl. der Konstruktion der unteren Ellipse, mit der ich ja den 3D-Effekt erzeugen möchte, etwas weitergekommen. Ich weiß alledings nicht, ob dies die schönste Lösungsmöglichkeit ist. Ein "ellipse through (Punkt)" scheint es nicht zu geben.
\documentclass[a4paper,%
          11pt,%
          DIV=10,%
          BCOR=0mm,%
          twoside=semi,%
          footnotes=multiple]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{matrix,arrows,intersections,calc,through}

\begin{document}
\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    % Kreis
    \draw[name path = kreis] (0,0) circle [radius=2];
    \draw (0,0) ellipse [x radius=2, y radius=0.5];
    \path[name path=untere linie] (-3,-1.25) -- (3,-1.25);
    \path[name intersections={of=kreis and untere linie, name=unten}];
    \coordinate (furchtbar) at ($(unten-1)!0.5!(unten-2)$);
    \draw[dashed] ($(unten-1)!0.5!(unten-2)$) let
				\p1 = ($(unten-1) - (furchtbar)$),
				\n2 = {veclen(\x1,\y1)}
			      in
				(unten-2) arc [x radius=\n2, y radius=0.15cm, start angle=0, end angle=180];
    \draw ($(unten-1)!0.5!(unten-2)$) let
				\p1 = ($(unten-1) - (furchtbar)$),
				\n2 = {veclen(\x1,\y1)}
			      in
				(unten-2) arc [x radius=\n2, y radius=0.15cm, start angle=360, end angle=180];
% 				(unten-2) arc [x radius=\n2, y radius=0.15cm, start angle=0, end angle=180]; % hier irgendwo [dashed] 'rein?
  \end{tikzpicture}
  \caption{Kreis}
  \label{fig:kreis}
\end{figure}

\end{document}
Gibt es denn eine Lösung, nur 1x "let" zu verwenden und zeitgleich den einen Ellipsen-Bogen "dashed" und den anderen "solid" zu zeichnen?

Ein Problem, das mich auch noch einige Zeit lang beschäftigt hatte, war, dass ich innerhalb von "let" die \p1 und \n2 Definitionen gerne schon berechnen wollte. Ursprünglich wollte ich die Distanz einfach mit "* 0.5" halbieren :). Das geht aber leider nicht.

Habe ich es denn richtig verstanden, dass, wenn ich mehrere \p1, \p2, ... definiere, dass dann \x1, \x2, ... (analog \y1, \y2, ...) sich immer auf das jeweilige \pX beziehen? Sprich \x42 ruft x-Koordinate von \p42 auf.

Und die \nX sind nur dazu da, um so etwas wie "veclen" auszuführen. Wofür man die sonst noch braucht, kann ich gerade nicht sagen. Kann mir das vielleicht jemand sagen? Das ist mir auch noch etwas unklar :).

Antworten