Problem kurz zusammengefasst: Der Ellipsenbogen soll um Z herum liegen und bei den braunen Linien beginnen und enden...
Ich möchte Kreisbögen und Ellipsenbögen um einen Mittelpunkt zeichnen.
Daher verwende ich die Syntax (TikZ-Handbuch 2.10, Seite 36)
\draw[]([shift=(\wStart:\r)]Z) arc[start angle=\wStart, end angle=\wEnd, radius=\r];
mit definierten Werten \wStart
, \wEnd
, \r
und einer Mittelpunktskoordinate Z
(die nicht notwendigerweise ist (0,0)
) für Kreisbögen und das funktioniert
FürEllipsenbögenIch verwende die Syntax aus demTikZ-Handbuch 2.10, Seite 37
\draw[red] ([shift=(\wStart:\rx)]Z) arc [start angle=\wStart, end angle=\wEnd, x radius=\rx, y radius=\ry];
im folgenden MWE.
Aber es scheint, dass meine "Center-Shift" falsch ist oder nicht funktioniert(und vielleicht (?) scheinen Start- und Endwinkel nicht korrekt zu sein).
Was muss ich tun?
Übrigens:ich sahdieser Thread(erhalte mit seiner Methode nicht das richtige Ergebnis), aber ich würde gerne die TikZ-Syntax korrigieren.
Der Ellipsenbogen sollte an den braunen Linien beginnen und enden …
\documentclass[tikz, margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[gridded]
% Center
\coordinate[label=below:Z] (Z) at (0,0);
\fill[] (Z) circle[radius=2pt];
% Values ===============
\def\rx{1.75}
\def\ry{1}
\def\r{\rx}
\def\wStart{20}
\def\wEnd{315}
% ====================
% Help lines
\draw[brown] (Z) -- (\wStart:\r);
\draw[brown] (Z) -- (\wEnd:\r);
% Full circle and ellipse
\draw[] (Z) circle[radius=\r];
\draw[] (Z) circle[x radius=\rx, y radius=\ry];
% cirlce arc
\draw[blue] ([shift=(\wStart:\r)]Z) arc [start angle=\wStart, end angle=\wEnd, radius=\r] node[near start]{good};
% ellipse arc
\draw[red] ([shift=(\wStart:\rx)]Z) arc [start angle=\wStart, end angle=\wEnd, x radius=\rx, y radius=\ry] node[near start]{bad};
\end{tikzpicture}
\end{document}
Antwort1
Für einen anderen Ansatz können Sie einen Maßstab anwenden, einen Bogen zeichnen und die neuen Winkel berechnen:
\pgfmathsetmacro\myscale{\ry/\rx}
\pgfmathsetmacro\wStartE{atan(tan(\wStart)/\myscale)}
\pgfmathsetmacro\wEndE{360+atan(tan(\wEnd)/\myscale)}
Ein vollständiges Beispiel könnte sein:
\documentclass[tikz, margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[gridded]
% Center
\coordinate[label=below:Z] (Z) at (0,0);
\fill[] (Z) circle[radius=2pt];
% Values ===============
\def\rx{1.75}
\def\ry{1}
\def\r{\rx}
\def\wStart{20}
\def\wEnd{315}
% Scale and new angles
\pgfmathsetmacro\myscale{\ry/\rx}
\pgfmathsetmacro\wStartE{atan(tan(\wStart)/\myscale)}
\pgfmathsetmacro\wEndE{360+atan(tan(\wEnd)/\myscale)}
% ====================
% Help lines
\draw[brown] (Z) -- (\wStart:\r);
\draw[brown] (Z) -- (\wEnd:\r);
% Full circle and ellipse
\draw[] (Z) circle[radius=\r];
\draw[] (Z) circle[x radius=\rx, y radius=\ry];
% cirlce arc
\draw[blue] ([shift=(\wStart:\r)]Z) arc [start angle=\wStart, end angle=\wEnd, radius=\r] node[near start]{good};
% ellipse arc
\draw[red,yscale=\myscale] ([shift=(\wStartE:\r)]Z) arc [start angle=\wStartE, end angle=\wEndE, radius=\r] node[near start]{good?};
\end{tikzpicture}
\end{document}
Antwort2
Mit tkz-elements
erfordert die Kompilierung mitlualatex
Edit: Mit Qrrbrbirlbels Kommentar verwende ich den Clip, der sich der Situation anpasst
Edit2: Mit dem Kommentar von Alain Matthes können wir in der tkz-elements
Dokumentation lesen:
set_lua_to_tex. Sie müssen dabei vorsichtig vorgehen, da die von Ihnen erstellten Makros derzeit leider global sind und Sie vorhandene Makros überschreiben können. Eine Lösung besteht darin, entweder einen Makronamen zu wählen, der keine Probleme verursacht, oder das ursprüngliche Makro zu speichern.
% !TeX TS-program = lualatex
\documentclass{standalone}
\usepackage{tkz-elements}
\usepackage{tkz-euclide}
\begin{document}
\begin{tkzelements}
rx = value(1.75)
ry = value(1)
wStart = 20
wEnd = 315
z.Z = point: new (0 , 0)
z.A = point: new (0 , rx)-- to draw the circle
--
c = circle : new (z.Z,z.A)
e = ellipse: radii (z.Z,rx,ry,0)
--
z.Sp = point : polar_deg(rx,wStart)
L.ZSp = line : new ( z.Z , z.Sp )
if wStart <180 then
z.S,_ = intersection (e,L.ZSp)-- Start point
else
_,z.S = intersection (e,L.ZSp)
end
--
z.Ep = point : polar_deg(rx,wEnd)
L.ZEp = line : new ( z.Z , z.Ep )
if wEnd <180 then
z.E,_ = intersection (e,L.ZEp)-- End point
else
_,z.E = intersection (e,L.ZEp)
end
--
-- set_lua_to_tex{"rx","ry","wStart","wEnd"}-- see Alain Matthes'comment
\end{tkzelements}
\begin{tikzpicture}[gridded]
% Edit2
\newcommand{\rx}{\tkzUseLua{rx}}
\newcommand{\ry}{\tkzUseLua{ry}}
\newcommand{\wStart}{\tkzUseLua{wStart}}
\newcommand{\wEnd}{\tkzUseLua{wEnd}}
%
\tkzGetNodes
\tkzDrawPoints(Z,S,S',E,E')
\tkzLabelPoints(Z)
\tkzDrawCircle[blue](Z,A)
%\draw[green!70!black] (Z) -- +(\wStart:2*\rx) arc[start angle=\wStart, end angle=\wEnd, radius=2*\rx] -- cycle;
\begin{scope}
% With Qrrbrbirlbel's comment
\clip [overlay](Z) -- +(\wStart:2*\rx) arc[start angle=\wStart, end angle=\wEnd, radius=2*\rx] -- cycle;
%
\tkzDrawEllipse[red](Z,\rx,\ry,0)
\end{scope}
\tkzDrawSegments[brown](S,Z Z,E)
\tkzDrawSegments[brown,dashed](S,S' E,E')
\end{tikzpicture}
\end{document}
Antwort3
Ich fürchte, das könnte eine harte Arbeit werden, die TikZ-Ellipse zu "hacken", also habe ich
Polarform relativ zum Mittelpunktund dann ein plot
:
\documentclass[tikz, margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[gridded,
]
% Values ===============
\def\rx{1.75}
\def\ry{1}
\def\r{\rx}
\def\wStart{20}
\def\wEnd{315}
% ====================
% Center
\coordinate[label=below:{(0,0)}] (O) at (0,0);
\coordinate[label=below:Z] (Z) at (1.3,2);
\foreach \P in {O,Z} \fill[] (\P) circle[radius=2pt];
% Help lines
\draw[brown] (Z) -- +(\wStart:\r);
\draw[brown] (Z) -- +(\wEnd:\r);
% Full circle and ellipse
\draw[] (Z) circle[radius=\r];
\draw[] (Z) ellipse[x radius=\rx, y radius=\ry];
% circle arc
\draw[blue] ([shift=(\wStart:\rx)]Z) arc [start angle=\wStart, end angle=\wEnd, radius=\r];
% ellipse arc
\tikzset{% https://en.wikipedia.org/wiki/Ellipse#Polar_form_relative_to_center
declare function={
E=sqrt(\rx^2-\ry^2)/\rx;
PolarEllipse(\x)=\ry/sqrt(1-E^2*cos(\x)^2); }, }%
\draw[red, very thick,
domain=\wStart:\wEnd,
samples=111
] plot ([shift={(Z)}]\x:{PolarEllipse(\x)});
\end{tikzpicture}
\end{document}
Antwort4
Nur zum Spaß: Dabei werden Kreise und Ellipsen verwendet und der nicht gewünschte Teil abgeschnitten. Beachten Sie die Verwendung von , -| (\r,0) |-
um den abgeschnittenen Bereich bis zum Rand zu erweitern.
\documentclass[tikz, margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[gridded]
% Center
\coordinate[label=below:Z] (Z) at (0,0);
\fill[] (Z) circle[radius=2pt];
% Values ===============
\def\rx{1.75}
\def\ry{1}
\def\r{\rx}
\def\wStart{20}
\def\wEnd{315}
% ====================
% Help lines
\draw[brown] (Z) -- (\wStart:\r);
\draw[brown] (Z) -- (\wEnd:\r);
% Full circle and ellipse
\draw[] (Z) circle[radius=\r];
\draw[] (Z) circle[x radius=\rx, y radius=\ry];
% cirlce arc
\begin{scope}[even odd rule]
\clip (-\r,-\r) rectangle (\r,\r)% clip exterior
(\wStart:2) -- (Z) -- (\wEnd:2) -| (\r,0) |- cycle;% clip interior
\draw[blue] (Z) circle [radius=\r];
% ellipse arc
\draw[red] (Z) ellipse [x radius=\rx, y radius=\ry];
\end{scope}
\end{tikzpicture}
\end{document}