给定两个节点(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}
这产生了
(我希望我绘制的椭圆位于环内,即每个端点应该分别与内部分或外部分相切。)
作为比较,如果我不尝试制作椭圆,而是在新坐标系中从(-1,0)
到画一条线,则通过将范围的内容更改为(1,0)
\begin{scope}[shift={(c)},x={(a)}]
\draw (-1,0) -- (1,0);
\end{scope}
然后事情就会按照我想要的方式进行:
这是可行的,因为它不需要使用任何 y 坐标。
不幸的是,我不知道应该将 y 向量坐标改为哪个向量。如果有简单的方法可以确定连接(a)
和的线段的垂直平分线(b)
,以便我可以将 y 向量坐标改为它,那就太好了,但我也希望有其他方法可以解决这个问题。
答案1
我认为这个问题与标题所暗示的完全不同。如果你不经常做这种图形,你可以应用一个scale=0.7
来得到所需的结果:
代码:
\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
这是我根据您提出的问题所理解的一点浅见。警告:代码很丑陋.请按您的喜好进行清洁。
问题是你必须得到点的x
和y
坐标。为了做到这一点,我(可耻地)借用了 Andrew Stacey 的\gettikzxy
宏提取 TikZ 中任意点的 x,y 坐标。
关于
(短轴可以是任意长度)。主要的困难在于这个椭圆的轴不需要与标准坐标轴平行。
我们可以使用距离修正器
\coordinate (d) at ($ (c)!0.75cm!90:(b)$);
这里,0.75cm
是椭圆短轴的尺寸,是它与连接节点和的90
线之间的夹角。c
b
我们还需要存储半长轴和半短轴的尺寸。以下代码片段负责处理此问题。
\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}