![如何根据点绘制圆的一部分](https://linux22.com/image/450079/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E7%82%B9%E7%BB%98%E5%88%B6%E5%9C%86%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.png)
给定三个点 $v_1, v_2, v_3$ 和一个以 $v_1$ 为中心且 $v_2, v_3$ 位于其边界上的圆,我想删除不在 $v_2$ 和 $v_3$ 之间的圆的部分。如果知道相应的角度,我知道如何做到这一点(例如,在下面的代码中,我想获取圆在角度 0 和 90 之间的部分)。但我不知道如何计算非矩形设置。
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{arrows}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\path
(0,0) coordinate (v1) node[below]{$v_1$}
(1,0) coordinate (v2) node[below]{$v_2$}
(0,1) coordinate (v3) node[below]{$v_3$};
\draw (v1)--(v2) (v1)--(v3);
\draw (v1) circle(1);
\foreach \p in {v1,v2,v3}
\fill (\p) circle(2pt);
\end{tikzpicture}
\end{document}
答案1
如果您知道角度,则可以使用arc
命令:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill (0,0) coordinate[label=below:$v_1$] (v1) circle(2pt);
\fill (30:2cm) coordinate[label=right:$v_2$] (v2) circle(2pt);
\fill (95:2cm) coordinate[label=$v_3$] (v3) circle(2pt);
\draw (v3)--(v1)--(v2) arc[start angle=30, end angle=95, radius=2];
\end{tikzpicture}
\end{document}
如果您不知道角度,calc
图书馆可以提供帮助:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\foreach \i in {1,2,3}{
\begin{tikzpicture}
\fill (0,0) coordinate[label=below:$v_1$] (v1) circle(2pt);
\fill (360*rand:2cm) coordinate[label=right:$v_2$] (v2) circle(2pt);
\fill (360*rand:2cm) coordinate[label=$v_3$] (v3) circle(2pt);
\draw let \p1=($(v2)-(v1)$), \p2=($(v3)-(v1)$), \n1={veclen(\x1,\y1)}, \n2={atan2(\y1,\x1)},
\n3={atan2(\y2,\x2)} in (v3)--(v1)--(v2) arc[start angle=\n2, end angle=\n3, radius=\n1];
\end{tikzpicture}}
\end{document}
答案2
在您的特定情况下,从笛卡尔坐标到极坐标的变换非常简单。根据初等几何,我们知道:
(0,1) --> (90:1)
(1,0) --> (0:1)
考虑到上面的arc
命令定义起来很简单。因此,您的 MWE 可以更改为:
\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
calc,
positioning}
\begin{document}
\begin{tikzpicture}[
dot/.style = {circle, fill, inner sep=1pt,
label=#1, node contents={}},
every label/.append style = {inner sep=2pt, font=\footnotesize}
]
\draw (0,0) node[dot=below:$v_1$] --
(0,1) node[dot=above:$v_2$] arc(90:0:1)
node[dot=below:$v_3$] -- cycle;
\end{tikzpicture}
\end{document}
在更一般的笛卡尔坐标系下,需要先用反三角函数计算起始角t和终止角。例如:
\alpha = acos{\frac{x}{x^2 + y^2}
其中x
和y
是$x,y$平面上某一点的笛卡尔坐标。
答案3
您可以使用 来完成此操作\clip
,尽管对于短弧(蓝色)来说比长弧(红色)要容易得多。
\documentclass{standalone}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{arrows}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\path
(0,0) coordinate (v1) node[below]{$v_1$}
(1,0) coordinate (v2) node[below]{$v_2$}
(0,1) coordinate (v3) node[below]{$v_3$};
\draw (v1)--(v2) (v1)--(v3);
\begin{scope}
\clip (v2) rectangle (v3);
\draw[blue] (v1) circle(1);
\end{scope}
\begin{scope}[local bounding box=Bob]
\path (v1) circle(1);
\clip (Bob.north west)--(v3)--(v1)--(v2)--(Bob.south east)--
(Bob.south west)--cycle;
\draw[red] (v1) circle(1);
\end{scope}
\foreach \p in {v1,v2,v3}
\fill (\p) circle(2pt);
\end{tikzpicture}
\end{document}