PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TikZ: Intersektion und Perpendicular



Dirk2718
25-09-2012, 10:26
Hallo Zusammen,

ich möchte zwischen zwei Linien eine senkrechte Linie einfügen. Diese geht von der ersten und sollte bei der zweiten Enden. Hier ein funktionierendes Minimalbeispiel:

\documentclass[ compress
%, handout
]{beamer}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}

\usetikzlibrary{intersections}

\mode< presentation >
{
% Präsentationsthema auswählen
\usetheme{Boadilla}

% äußeres Thema anpassen
\useoutertheme[subsection=false]{miniframes}
}

\begin{document}

\begin{frame}
\begin{tikzpicture}
% Zwei Linien
\draw[-, name path=line1] (0, 0) -- ++(2, 0) node[right] {1};
\draw[-, name path=line2] (0, 1) -- ++(2, 0) node[right] {2};
% Intersektion geht
\path[name path=lineV] (1, 0) -- ++(0, 2);
\draw [name intersections={of={lineV and line2}, by=x}]
[very thick, orange] (1,0) -- (x);
\end{tikzpicture}
\end{frame}

\end{document}


Nun meine Frage: Ich würde gerne den Pfad für lineV in der Länge variable lassen, da ich dort Pfade von Funktionen einfügen möchte, die immer mal wieder anders sind. Des weiteren in der jetzigen Form mein Bild 2 Einheiten hoch ist, was unnötig ist. Dazu wäre ja die Perpendicular Funktionalität super. Nur mit der bekomme ich keine Schnittpunkt hin. Könnt ihr mir da helfen?

Vielen Dank und Grüße
Dirk

esdd
25-09-2012, 12:13
Hallo,

ganz verstanden habe ich nicht, was du machen möchtest. Aber hier ist ein Vorschlag, bei dem von einem Punkt der ersten Gerade das Lot auf die zweite gefällt wird.

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\fbox{\begin{tikzpicture}
\draw (0,0)--+(2,0)node[right]{1}coordinate[pos=0.5](g1);
\draw (0,1)coordinate(g2a)--+(2,0)coordinate(g2b)node[right]{2};
%Lot fällen von (g1) auf die Gerade durch (g2a) und (g2b)
\draw[very thick,orange] (g1) -- ($(g2a)!(g1)!(g2b)$);
\end{tikzpicture}}

\bigskip
\fbox{\begin{tikzpicture}
\draw (0,0)--+(2,0.5)node[right]{1}coordinate[pos=0.6](g1);
\draw (0,1)coordinate(g2a)--+(2,0.5)coordinate(g2b)node[right]{2};
\draw[very thick,orange] (g1) -- ($(g2a)!(g1)!(g2b)$);
\end{tikzpicture}}

\end{document}
Gruß
Elke

Dirk2718
25-09-2012, 13:23
Hallo Elke,

das ist schon ganz brauchbar. Nur ist die obere Linie ein freier Pfad, in meinem Fall die Dichte einer Normalverteilung. Diese lasse ich über gnuplot berechnen und die Koordinatendatei dann mit der Plotfunktion von TikZ darstellen. Das heißt, ich habe einen unbekannten Pfad und darunter eine Linie (x-Achse). Jetzt möchte von einem Punkt der x-Achse ein Lot auf die darüber liegende Dichte der Normalverteilung (Linie 2) Fällen, von der ich nur den "name path" habe.

Klar könnte ich, wie oben angedeutet, erst einen Pfad machen und dann bis zum Schnittpunkt zeichnen. Das kann aber viel zu lang werden und das Bild ist zu groß. Oder ich habe den Pfad nicht lang genug gemacht und laufe in einen Fehler.

Konnte ich meine Frage etwas klarer machen?

Vielen Dank und Grüße
Dirk

esdd
25-09-2012, 14:50
Hallo,

ich geh mal davon aus, dass du eine Senkrechte von der x-Achse bis zu der Kurve haben willst. Damit du die lineV beliebig lang machen kannst, brauchst du nur die Berechnung der bounding box zu unterbrechen.

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}

\begin{document}
\begin{tikzpicture}
% Zwei Linien
\draw[-, name path=line1] (0, 0) -- ++(2, 0) node[right] {1};
\draw[-, name path=line2] (0, 1) -- ++(2, 3) node[right] {2};
\begin{pgfinterruptboundingbox}
\path[name path=lineV] (1, 0) -- ++(0, 200);
\draw [name intersections={of={lineV and line2}, by=x}]
[very thick, orange] (1,0) -- (x);
\end{pgfinterruptboundingbox}
\end{tikzpicture}
\end{document}

Die Frage ist nur, ob die Rechengenauigkeit für die Bestimmung des Schnittpunktes reicht, wenn line2 ein Plot ist.

Gruß
Elke

Dirk2718
27-09-2012, 13:11
Hallo Elke,

das sieht gut aus!

Wobei ich am liebsten noch von der definierten Länge der Linie lineV weg gehen würde. Aber scheinbar gibt es nicht so einen Befehl wie, gehe orthogonal von einem Punkt auf line1 nach line2 bis diese geschnitten wird.

Das klappt scheinbar gut. Ich habe das gerade mit einer Kurve probiert und diese nur an wenigen Punkten berechnet. Da hatte ich damit gerechnet, dass die orangene Linie einen Abstand zur Kurve hat. Passt aber wunderbar. :-)

Vielen Dank und Grüße
Dirk

P.S.: Hinweise zum ersten Absatz nehme ich gerne entgegen. ;-)

Dirk2718
27-09-2012, 19:24
Hallo Elke,

ich habe zu der pgfinterruptboundingbox noch eine Frage:
Warum muss die insektion innerhalb der box passieren? Stelle ich da Argument außerhalb wird die Linie falsch gezeichnet. Aber eigentlich reicht es ja für den \path die Berechnung abzustellen.

Ich würde gern verstehen was dahinter passiert, daher die Frage.

Viele Grüße
Dirk

esdd
27-09-2012, 22:08
Hallo Dirk,

im pgfmanual (http://texdoc.net/texmf-dist/doc/generic/pgf/pgfmanual.pdf) steht zum Thema "name path", dass die Zuweisung des Pfadnamens nur für die aktuelle scope gilt. Nach dem Ende der Umgebung weiß tikz nicht mehr, was lineV ist und du bekommst die Fehlermeldung: I do not know the path named ‘lineV'.

Alternativ kannst du "name path global" verwenden, was Manuel im gleichen Abschnitt beschrieben ist.


\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}

\begin{document}
\begin{tikzpicture}
% Zwei Linien
\draw[-, name path=line1] (0, 0) -- ++(2, 0) node[right] {1};
\draw[-, name path=line2] (0, 1) -- ++(2, 3) node[right] {2};
\begin{pgfinterruptboundingbox}
\path[name path global=lineV] (1, 0) -- ++(0, 200);
\end{pgfinterruptboundingbox}
\draw [name intersections={of={lineV and line2}, by=x}]
[very thick, orange] (1,0) -- (x);
\end{tikzpicture}
\end{document}
Gruß
Elke

Dirk2718
28-09-2012, 11:34
Hallo Elke,

den Abschnitt habe ich sogar gerade gelesen. ;-) Mich wunderte nur, dass davon nicht auch die Koordinate x betroffen ist.

Nun habe ich noch eine weiteres Problem, welches sich an das obige anlehnt. Ich möchte die Fläche in der folgenden Graphik ausfüllen. Wie kann ich das mit den Informationen über die path names und die Schnittpunkte machen?


\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{ calc
, intersections
}

\begin{document}
\begin{tikzpicture}
% Zwei Linien
\draw[-, name path=line1] (0, 0) -- ++(5, 0) node[right] {1};
\draw[-, name path=line2] (0, 1) .. controls +(2, 3) .. ++(5, 4) node[right] {2};
\draw (2, 4) circle (1pt);
\begin{pgfinterruptboundingbox}
\path[name path=lineV1] (1, 0) -- ++(0, 20);
\draw [name intersections={of={lineV1 and line2}, by=x1}]
[very thick, orange] (1, 0) -- (x1);

\path[name path=lineV2] (4, 0) -- ++(0, 20);
\draw [name intersections={of={lineV2 and line2}, by=x2}]
[very thick, orange] (4, 0) -- (x2);
\end{pgfinterruptboundingbox}
\end{tikzpicture}
\end{document}


Ich habe schon etwas rumprobiert, da im zweiten Abschnitt zu name path steht, dass dieser erweitert werden kann, so dass man einen geschlossenen Pfad konstruiert. Das habe ich aber nicht hin bekommen.

Vielen Dank und Grüße
Dirk

esdd
28-09-2012, 12:31
Hallo,

ich nehme an, du meinst die Fläche zwischen den beiden senkrechten Linien:


\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}

\begin{document}
\begin{tikzpicture}
% Zwei Linien
\draw[-, name path=line1] (0, 0) -- ++(5, 0) node[right] {1};
\draw[-, name path=line2] (0, 1) .. controls +(2, 3) .. ++(5, 4) node[right] {2};
\draw (2, 4) circle (1pt);
\begin{pgfinterruptboundingbox}
\path[name path=lineV1] (1, 0) -- ++(0, 20);
\draw [name intersections={of={lineV1 and line2}, by=x1}]
[very thick, orange] (1, 0) -- (x1);
%
\path[name path=lineV2] (4, 0) -- ++(0, 20);
\draw [name intersections={of={lineV2 and line2}, by=x2}]
[very thick, orange] (4, 0) -- (x2);
%
\begin{scope}% begrenzt die Wirkung des Clippens
\clip(1,0)rectangle(4,20);
\fill[orange,opacity=0.5] (1,0)--(0, 1) .. controls +(2, 3) .. ++(5, 4)--(4,0);
\end{scope}
\end{pgfinterruptboundingbox}
\end{tikzpicture}
\end{document}
Gruß
Elke

Dirk2718
28-09-2012, 13:02
Hallo Elke,

genau die Fläche meine ich. Allerdings nimmst du die Punkte in die controls und malst damit den Pfad ein weiteres mal. Was, wenn ich einen Pfad habe den ich so explizit nicht kenne? Beispielsweise über eine plot Funktion aus einer Datei.

Viele Grüße
Dirk

esdd
28-09-2012, 14:28
Hallo,

dann muss eben der plot wiederholt werden. Ich habe keine Idee, wie man das Vermeiden könnte. Die zwei Punkte auf der x-Achse habe ich jetzt mit h1 und h2 bezeichnet und die Kurve durch einen Plot von Koordinaten ersetzt:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}

\begin{document}
\begin{tikzpicture}
%Zwei Linien
\draw[-, name path=line1] (0, 0) -- ++(5, 0) node[right] {1};
\draw[-, name path=line2] plot [smooth] coordinates{(0.5,1) (1.5,1.2) (3,7) (4.5,5)} node[right] {2};
\draw (2, 4) circle (1pt);
\begin{pgfinterruptboundingbox}
\coordinate(h1)at(1,0);
\path[name path=lineV1] (h1) -- ++(0, 20);
\draw [name intersections={of={lineV1 and line2}, by=x1}]
[very thick, orange] (h1) -- (x1);
%
\coordinate(h2)at(4,0);
\path[name path=lineV2] (h2) -- ++(0, 20);
\draw [name intersections={of={lineV2 and line2}, by=x2}]
[very thick, orange] (h2) -- (x2);
%
\begin{scope}
\clip(h1)rectangle(h2|-0,20);
\fill[orange,opacity=0.5] (h1)--plot [smooth] coordinates{(0.5,1) (1.5,1.2)(3,7)(4.5,5)}--(h2);
\end{scope}
\end{pgfinterruptboundingbox}
\end{tikzpicture}
\end{document}
Eventuell kannst du auch über die Nutzung des Paketes pgfplots nachdenken. Damit kenne ich mich aber nicht weiter aus.
Gruß
Elke

Dirk2718
28-09-2012, 19:17
Gerade das redundante Zeichnen wollte ich vermeiden. Danke für den Tip mit pgfplots, vielleicht hilft mir das weiter.

Viele Grüße
Dirk

Dirk2718
01-10-2012, 09:29
Es scheint wirklich nicht ohne doppelt zeichnen zu gehen. Schade eigentlich.

Viele Grüße
Dirk