
Ich möchte einen Normalenvektor auf einer Kurve an einem bestimmten Punkt zeichnen. Ich habe mehrere Fragen nachgeschlagen (z. B.1,2,3, usw.) und die Antworten enthalten gute Lösungen zum Zeichnen einer Tangente oder eines Normalvektors zu einer Kurve an einem bestimmten Punkt, der durch eine Variable zwischen 0 und 1 angegeben wird, die die auf der Kurve zurückgelegte Strecke angibt.
Ein anderes Beispielverwendet absolute Entfernungen, aber diese Koordinate „wandert“ immer noch entlang der Kurve.
Ich habe jedoch mehrere Kurven, bei denen ich die absoluten Koordinaten eines Punkts (relativ zum Koordinatensystem des Bildes) kenne, aber nicht genau, wo er in dieser relativen Koordinate auf dieser Kurve liegt.
Im folgenden (nicht minimalen, aber funktionierenden) Beispiel verwende ich den sehr nützlichen Code vondiese Antwortund finde durch Ausprobieren heraus, dass die relative Koordinate meines Punktes P ungefähr 0,5573 beträgt. Da ich dies für verschiedene Kurventypen und verschiedene Punkte verwenden werde, ist das Ausprobieren sehr mühsam. Gibt es eine gute Lösung mit absoluten Koordinaten?
\documentclass[]{scrartcl}
\usepackage{tikz}
\usepackage{xcolor}
\usetikzlibrary{arrows,calc,positioning,decorations,decorations.markings,quotes,angles}
\tikzset{tangent/.style={
decoration={
markings,% switch on markings
mark=
at position #1
with
{
\coordinate (tangent point-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,0pt);
\coordinate (tangent unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (1,0pt);
\coordinate (tangent orthogonal unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,1);
}
},
postaction=decorate
},
use tangent/.style={
shift=(tangent point-#1),
x=(tangent unit vector-#1),
y=(tangent orthogonal unit vector-#1)
},
use tangent/.default=1}
\begin{document}
\begin{tikzpicture}[%baseline={([yshift=-.0ex]current bounding box.center)},
kvect/.style={->,>=stealth}]
% coordinates
\coordinate(O) at (0,0);
\coordinate(OAend) at (90:5.5);
\coordinate(OAstart) at (-90:.5);
\coordinate(X1) at (180:.5);
\coordinate(X2) at (0:3.5);
\coordinate(P) at (40:3cm and 5cm);
\coordinate(P2) at ($1.5*(P)$);
\coordinate(ARCSTART) at (-10:3cm and 5cm);
% curve
\draw[tangent=0.5573,color=darkgray] (ARCSTART) arc (-10:95:3cm and 5cm);
% other lines
\path[kvect] (OAstart) edge (OAend); % optical axis
\path[kvect] (X1) edge (X2);
\path[kvect,color=green] (O) edge (P);
\path[dashed,color=green] (P) edge (P2);
\path [kvect,color=green, use tangent](0,0) edge (0,-3) [] {};
\path [use tangent](0,0) -- (0,-3) node (Sp) [] {};
\path pic["$\rho$",angle eccentricity=1.5,angle radius=0.6cm,draw,<-,>=stealth,color=green] {angle = Sp--P--P2};
\path pic["$\theta$",angle eccentricity=1.5,angle radius=0.6cm,draw] {angle = P--O--OAend};
\end{tikzpicture}
\end{document}
Antwort1
Verwendung dertzplotPaket:
\documentclass[tikz]{standalone}
\usepackage{tzplot}
\begin{document}
\begin{tikzpicture}[font=\scriptsize]
\tzhelplines(7,6)
\tzaxes(7,6)
\tzcoor(40:3 and 5)(P)
\tzcoor($1.5*(P)$)(P2)
\tzarcfrom[gray]"arcA"(-10:3 and 5)(-10:95:3 and 5)
\tzline[->,green](0,0)(P)
\tzline[dashed,green](P)(P2)
\tztangent[blue!20,thin]"tan"{arcA}(P)[1:3.5]{tangent}[r]
\tzhXpointat{tan}{2}(P3a) % (P3a): point on tangent line
\tzcoor($(P)!1cm!90:(P3a)$)(P3) % (P3) : point on normal line
\tzgetxyval(P){\Px}{\Py}
\tzslopeat[->,green,tzextend={0pt}{2cm}]{arcA}{\Px}{.1pt}[90]
\tzanglemark[->,green](P2)(P)(P3){$\rho$}[green]
\tzrightanglemark(P3)(P)(P3a)
\tzanglemark(P)(0,0)(1,0){$\theta$}
\end{tikzpicture}
\end{document}