TikZ: эллипсы-дуги вокруг центральной точки с начальным и конечным углом

TikZ: эллипсы-дуги вокруг центральной точки с начальным и конечным углом

введите описание изображения здесь

Вкратце проблема: дуга эллипса должна располагаться вокруг точки Z и начинаться и заканчиваться на коричневых линиях...


Я хочу нарисовать дуги окружности и эллипса вокруг центральной точки.

Поэтому я использую синтаксис (TikZ-руководство 2.10, стр. 36)

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

с определенными значениями \wStart, \wEndи \rкоординатой средней точки Z(которая не обязательно (0,0)) для дуг окружности и это работает

Дляэллипсы-дугиЯ использую синтаксис, написанный вTikZ-руководство 2.10, стр. 37

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

в следующем MWE.

Но, похоже, мой «центральный сдвиг» неправильный или не работает.(и, возможно (?) начальный и конечный угол кажутся неправильными).

Что мне нужно сделать?

КСТАТИ:Я виделэта тема(не получаю правильного результата с помощью его метода), но я хотел бы исправить синтаксис TikZ.

введите описание изображения здесь

Эллипс-дуга должен начинаться и заканчиваться на коричневых линиях...

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

решение1

Другой подход — применить масштаб, нарисовать дугу и вычислить новые углы:

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

Полный пример может быть таким:

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

введите описание изображения здесь

решение2

С tkz-elementsтребует компиляции сlualatex

Редактировать: С комментарием Qrrbrbirlbel я использую клип, который адаптируется к ситуации

Редактирование 2: С комментарием Алена Маттеса мы можем прочитать в tkz-elementsдокументации:

set_lua_to_tex. Вам нужно действовать осторожно, потому что, к сожалению, на данный момент макросы, которые вы создаете, являются глобальными, и вы можете перезаписать существующие макросы. Одним из решений является либо выбор имени макроса, которое не вызовет никаких проблем, либо сохранение исходного макроса.

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

введите описание изображения здесь

решение3

Я боюсь, что это может стать тяжелой работой, чтобы "взломать TikZ-эллипс", поэтому я использовал Полярная форма относительно центраи затем 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}

решение4

Просто для развлечения: это использует круги и эллипсы и обрезает ненужную часть. Обратите внимание на использование -| (\r,0) |-для расширения обрезанной области до границы.

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

Связанный контент