TikZ: arcos de elipse alrededor de un punto central con ángulo inicial y final

TikZ: arcos de elipse alrededor de un punto central con ángulo inicial y final

ingrese la descripción de la imagen aquí

El problema en resumen: el arco de elipse debe estar alrededor de Z y debe comenzar y terminar en las líneas marrones...


Quiero dibujar arcos circulares y arcos de elipse alrededor de un punto central.

Entonces uso la sintaxis (TikZ-manual 2.10, página 36)

\draw[]([shift=(\wStart:\r)]Z) arc[start angle=\wStart, end angle=\wEnd, radius=\r];

con valores definidos \wStart, \wEndy \runa coordenada de punto medio Z(que no necesariamente es (0,0)) para arcos circulares y esto funciona

Paraarcos de elipseUtilizo la sintaxis escrita en elTikZ-manual 2.10, página 37

\draw[red] ([shift=(\wStart:\rx)]Z) arc [start angle=\wStart, end angle=\wEnd, x radius=\rx, y radius=\ry];

en el siguiente MWE.

Pero parece que mi "cambio de centro" está mal o no funciona(y tal vez (?) el ángulo inicial y final parece no ser correcto).

¿Que tengo que hacer?

POR CIERTO:Yo vieste hilo(No obtengo el resultado correcto con su método), pero me gustaría arreglar la sintaxis de TikZ.

ingrese la descripción de la imagen aquí

El arco de elipse debe comenzar y terminar en las líneas marrones...

\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}

Respuesta1

Para otro enfoque, puedes aplicar una escala, dibujar un arco y calcular los nuevos ángulos:

\pgfmathsetmacro\myscale{\ry/\rx}
\pgfmathsetmacro\wStartE{atan(tan(\wStart)/\myscale)}
\pgfmathsetmacro\wEndE{360+atan(tan(\wEnd)/\myscale)}

Un ejemplo completo podría ser:

\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}

ingrese la descripción de la imagen aquí

Respuesta2

Con tkz-elementsrequiere compilación conlualatex

Editar: Con el comentario de Qrrbrbirlbel, uso el clip que se adapta a la situación.

Edit2: con el comentario de Alain Matthes, podemos leer en la tkz-elementsdocumentación:

set_lua_to_tex. Debe proceder con cuidado porque, lamentablemente, en este momento las macros que crea son globales y puede sobrescribir las macros existentes. Una solución es elegir un nombre de macro que no cause ningún problema o guardar la macro inicial.

% !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}

ingrese la descripción de la imagen aquí

Respuesta3

Me temo que esto podría convertirse en un trabajo duro para "hackear la elipse TikZ", así que usé Forma polar relativa al centro.y luego un plot:

ingrese la descripción de la imagen aquí

\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}

Respuesta4

Sólo por diversión: esto utiliza círculos y elipses y recorta la parte no deseada. Tenga en cuenta el uso de -| (\r,0) |-para extender el área recortada hasta el borde.

\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}

información relacionada