如何仅给出椭圆的相反极点(顶点)在 TikZ 中绘制椭圆弧?

如何仅给出椭圆的相反极点(顶点)在 TikZ 中绘制椭圆弧?

给定两个节点(a)(b),我想从到绘制一个椭圆弧,(a)(b)长轴是连接(a)和的线段(b)(短轴可以是任意长度)。主要的困难是这个椭圆的轴不需要与标准坐标轴平行。此外,我不知道该点(b)相对于的角度是多少(a)

到目前为止,我所做的是,在一定范围内,将 tikz 坐标系的原点移动到(a)和之间的中点(b),并将坐标 x 向量更改为(a),计划(1,0)在此新坐标系中从 0 度到 180 度绘制一个普通的椭圆弧。

下面的例子是我试图绘制的几乎所有内容都被剥离的图画,但我留下了我如何制作点(a)(b)说明为什么我不知道它们的坐标。

\documentclass[11pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{amsmath,amssymb,amsthm,amsfonts,graphicx}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.markings,positioning}

\begin{document}
\begin{center}
\begin{tikzpicture}

\draw[postaction={decorate,decoration={markings,
      mark=at position 0.7 with {\node (a) {};}}}]
      (0,0) ellipse (0.6 and 0.4);

\draw[postaction={decorate,decoration={markings,
      mark=at position 0.7 with {\node (b) {};}}}]
      (0,0) ellipse (1.2 and 1);

\node (c) at ($(a)!0.5!(b)$) {};

\begin{scope}[shift={(c)},x={(a)}]
\draw (1,0) arc (0:180:1 and 0.3);
\draw[dashed] (-1,0) arc (180:360:1 and 0.3);
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}

这产生了

enter image description here

(我希望我绘制的椭圆位于环内,即每个端点应该分别与内部分或外部分相切。)

作为比较,如果我不尝试制作椭圆,而是在新坐标系中从(-1,0)到画一条线,则通过将范围的内容更改为(1,0)

\begin{scope}[shift={(c)},x={(a)}]
\draw (-1,0) -- (1,0);
\end{scope}

然后事情就会按照我想要的方式进行:

enter image description here

这是可行的,因为它不需要使用任何 y 坐标。

不幸的是,我不知道应该将 y 向量坐标改为哪个向量。如果有简单的方法可以确定连接(a)和的线段的垂直平分线(b),以便我可以将 y 向量坐标改为它,那就太好了,但我也希望有其他方法可以解决这个问题。

答案1

我认为这个问题与标题所暗示的完全不同。如果你不经常做这种图形,你可以应用一个scale=0.7来得到所需的结果:

enter image description here

代码:

\documentclass[11pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{amsmath,amssymb,amsthm,amsfonts,graphicx}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.markings,positioning}

\begin{document}
\begin{center}
\begin{tikzpicture}

\draw[postaction={decorate,decoration={markings,
      mark=at position 0.7 with {\node (a) {};}}}]
      (0,0) ellipse (0.6 and 0.4);

\draw[postaction={decorate,decoration={markings,
      mark=at position 0.7 with {\node (b) {};}}}]
      (0,0) ellipse (1.2 and 1);

\node (c) at ($(a)!0.5!(b)$) {};

\begin{scope}[red, shift={(c)},x={(a)}, scale=0.7]
\draw (1,0) arc (0:180:1 and 0.3);
\draw[dashed] (-1,0) arc (180:360:1 and 0.3);
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}

答案2

这是我根据您提出的问题所理解的一点浅见。警告:代码很丑陋.请按您的喜好进行清洁。

问题是你必须得到点的xy坐标。为了做到这一点,我(可耻地)借用了 Andrew Stacey 的\gettikzxy提取 TikZ 中任意点的 x,y 坐标

关于

(短轴可以是任意长度)。主要的困难在于这个椭圆的轴不需要与标准坐标轴平行。

我们可以使用距离修正器

\coordinate (d) at ($ (c)!0.75cm!90:(b)$);

这里,0.75cm是椭圆短轴的尺寸,是它与连接节点和的90线之间的夹角。cb

我们还需要存储半长轴和半短轴的尺寸。以下代码片段负责处理此问题。

\pgfmathsetmacro{\Minb}{\dx-\cx}%
\pgfmathsetmacro{\Majb}{\bx-\cx}%

要绘制椭圆,我们使用\pgfpathellipse宏。语法是

\pgfpathellipse{<center>}{<first axis>}{<second axis>}

其中<first axis><second axis>是轴向量。

综合起来,我们得到

代码

\documentclass[tikz]{standalone}

\usetikzlibrary{calc}

\makeatletter
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \edef#2{\the\pgf@x}%
  \edef#3{\the\pgf@y}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
%\draw (0,0) grid (3,3);
\coordinate (a) at (0,0); % one point
\coordinate (b) at (3,3); % the other point
\coordinate (c) at ($(a)!.5!(b)$); % center
\coordinate (d) at ($ (c)!0.75cm!90:(b)$); % the coordinate of one end of the minor axis
\coordinate (e) at ($(c)!.8!(b)$); % coordinate of one end of the major axis for the second ellipse. Adjust .8 to your liking
\coordinate (f) at ($(c)!.5!(d)$); % coordinate of one end of the minor axis for the second ellipse
\coordinate (g) at ($(d)!.5!(f)$);
%% Getting the x and y coordinates
\gettikzxy{(b)}{\bx}{\by}
\gettikzxy{(c)}{\cx}{\cy}
\gettikzxy{(d)}{\dx}{\dy}
\gettikzxy{(e)}{\ex}{\ey}
\gettikzxy{(f)}{\fx}{\fy}
%% Getting the values of the axes vectors
\pgfmathsetmacro{\Minb}{\dx-\cx}%
\pgfmathsetmacro{\Majb}{\bx-\cx}%
\pgfmathsetmacro{\Mins}{\fx-\cx}%
\pgfmathsetmacro{\Majs}{\ex-\cx}%
%% Drawing the ellipses
{%\color{red}
\pgfpathellipse{\pgfpoint{\cx}{\cy}}
    {\pgfpoint{\Majb}{\Majb}}
    {\pgfpoint{-\Minb}{\Minb}}
\pgfusepath{draw}}
{%\color{blue}
\pgfpathellipse{\pgfpoint{\cx}{\cy}}
    {\pgfpoint{\Majs}{\Majs}}
    {\pgfpoint{-\Mins}{\Mins}}
\pgfusepath{draw}}
%\foreach \letter in {a,b,c,d}
%   \fill (\letter) circle (2pt) node [above] {\letter};

%% Integrating Peter Grill's suggested scaling
\begin{scope}[red, shift={(g)},x={(c)}, scale=0.3]
\draw (1,0) arc (0:180:1 and 0.3);
\draw[dashed] (-1,0) arc (180:360:1 and 0.3);
\end{scope}
\end{tikzpicture}
\end{document}

输出

enter image description here

相关内容