我想在 tikz 中绘制以下图片
所有圆弧都是圆的一部分。我只想指定以下信息:点的坐标A和b、不同圆部分的半径不同,以及分数或百分比吨将紫色点和粉色点放置在圆圈上,位于两个先前定义的点之间的指定位置。
例如,我想说右弧上的大紫色点是从A到b,而左侧弧线上的大紫色点分别是从A到b,而粉色点则位于连接先前定义的大紫色点对的某个圆弧的中间。
如果我能将一些粉色圆圈“和谐地”放置在弯曲三角形的中心……
我的主要问题如下:假设我有两点A和b(由笛卡尔坐标给出)和半径\rad:这指定了通过给定半径的这些点的两个圆。我如何在其中一个圆上放置一个点吨% 沿途A到b?
一个等效问题如下:假设我有一个中心点中心和两点A和b,其坐标以笛卡尔坐标表示:如何找到相对于该点的极坐标中心?
我是否必须使用线性代数(例如矩阵旋转,但也使用反正弦查找角度),或者 tikz 能否为我提供一个简单的解决方案?
下面的代码只能找到这些圆的中心,但我不知道如何找到极坐标A和b相对于这个中心,或者如何放置一个点吨百分比A到b。
\documentclass[11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{calc, intersections}
\begin{document}
\begin{center}
\begin{tikzpicture}
\def\rad{8};
\coordinate (b) at (5,8);
\coordinate (a) at (0,0);
\draw [fill=green] (a) circle (2pt);
\draw [fill=green] (b) circle (2pt);
\path [name path = acirc] (a) circle (\rad);
\path [name path = bcirc] (b) circle (\rad);
\path [name intersections={of=acirc and bcirc}];
\coordinate (centerab) at (intersection-1);
\draw (centerab) circle (2pt);
\draw (centerab) circle (\rad);
\end{tikzpicture}
\end{center}
\end{document}
答案1
我认为这叫双极坐标。
这是一个简单的实现
\documentclass[border=9,tikz]{standalone}
\begin{document}
\makeatletter
\tikzset{
cs/.cd,
F1/.store in=\tikz@cs@Fone,
F1={-1,0},
F2/.store in=\tikz@cs@Ftwo,
F2={1,0},
sigma/.store in=\tikz@cs@sigma,
sigma=180,
s/.store in=\tikz@cs@sigma,
tau/.store in=\tikz@cs@tau,
tau=0,
t/.store in=\tikz@cs@tau,
}
\tikzdeclarecoordinatesystem{bipolar}
{%
\tikzset{cs/.cd,#1}%
\tikz@scan@one@point\pgf@process(\tikz@cs@Fone)\pgfmathsetmacro\Fax{\pgf@x}\pgfmathsetmacro\Fay{\pgf@y}%
\tikz@scan@one@point\pgf@process(\tikz@cs@Ftwo)\pgfmathsetmacro\Fbx{\pgf@x}\pgfmathsetmacro\Fby{\pgf@y}%
\pgfmathsetmacro\Fmidx{(\Fax+\Fbx)/2}\pgfmathsetmacro\Fmidy{(\Fay+\Fby)/2}%
\pgfmathsetmacro\Funitx{(\Fbx-\Fax)/2}\pgfmathsetmacro\Funity{(\Fby-\Fay)/2}%
\pgfmathsetmacro\compou{(sinh(\tikz@cs@tau))/(cosh(\tikz@cs@tau)-cos(\tikz@cs@sigma))}%
\pgfmathsetmacro\compov{(sin(\tikz@cs@sigma))/(cosh(\tikz@cs@tau)-cos(\tikz@cs@sigma))}%
\pgfmathsetlength\pgf@x{\Fmidx+\compou*\Funitx-\compov*\Funity}%
\pgfmathsetlength\pgf@y{\Fmidy+\compou*\Funity+\compov*\Funitx}%
}
\tikz{
\fill[green]
(0,0)circle(.1)coordinate(a)
(8,3)circle(.1)coordinate(b);
\draw[purple]foreach\tau in{-2,-1.8,...,2}{
(bipolar cs:F1=a,F2=b,sigma=90,tau=\tau)circle(.1)
};
\draw[cyan]foreach\sigma in{10,20,...,350}{
(bipolar cs:F1=a,F2=b,sigma=\sigma,tau=1)circle(.1)
};
}
\end{document}
这是另一个例子
\tikz{
\fill[green]
(0,0)circle(.1)coordinate(a)
(8,3)circle(.1)coordinate(b);
\fill[purple]foreach\sigma in{30,40,...,330}{
foreach\tau in{-2,-1.8,...,2}{
(bipolar cs:F1=a,F2=b,sigma=\sigma,tau=\tau)circle(.1)
}
};
\draw[->](bipolar cs:F1=a,F2=b,sigma=340,tau=2)->+(1,2)node[above]{$\sigma$};
\draw[->](bipolar cs:F1=a,F2=b,sigma=340,tau=2)->+(2,-1)node[right]{$\tau$};
}