将点放置在由两点和半径定义的圆上

将点放置在由两点和半径定义的圆上

我想在 tikz 中绘制以下图片

在此处输入图片描述

所有圆弧都是圆的一部分。我只想指定以下信息:点的坐标Ab、不同圆部分的半径不同,以及分数或百分比将紫色点和粉色点放置在圆圈上,位于两个先前定义的点之间的指定位置。

例如,我想说右弧上的大紫色点是从Ab,而左侧弧线上的大紫色点分别是从Ab,而粉色点则位于连接先前定义的大紫色点对的某个圆弧的中间。

如果我能将一些粉色圆圈“和谐地”放置在弯曲三角形的中心……


我的主要问题如下:假设我有两点Ab(由笛卡尔坐标给出)和半径\rad:这指定了通过给定半径的这些点的两个圆。我如何在其中一个圆上放置一个点% 沿途Ab

一个等效问题如下:假设我有一个中心点中心和两点Ab,其坐标以笛卡尔坐标表示:如何找到相对于该点的极坐标中心

我是否必须使用线性代数(例如矩阵旋转,但也使用反正弦查找角度),或者 tikz 能否为我提供一个简单的解决方案?


下面的代码只能找到这些圆的中心,但我不知道如何找到极坐标Ab相对于这个中心,或者如何放置一个点百分比Ab

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

相关内容