Настройте координаты этой дуги

Настройте координаты этой дуги

Я хочу сделать гиперболу, которая будет содержать точки, находящиеся на одинаковом расстоянии от двух окружностей. Не очень интересна точность, скорее фигура, которая даст студентам идею. Вот мой код:

\documentclass{article}

\usepackage{amsmath}
\usepackage{tikz}

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}
    \draw (2,2) circle (1cm);
    \draw (5,0) .. controls (6,4) and (5,6) .. (3,6);
    \draw (10,2) circle (3cm);
\end{tikzpicture}
\caption{All points that are equidistant from both circles, lie on the hyperbola}
\end{figure}

\end{document}

Можете ли вы помочь?

введите описание изображения здесь

решение1

В следующем примере область изображения (ее часть) сканируется построчно снизу вверх, чтобы найтиИксположение, при котором расстояния между текущей точкой и окружностями имеют минимальную разницу. Расстояние от точки можно вычислить, вычитая радиус из расстояния текущей точки до центра окружности (и взяв абсолютное значение для случая, когда текущая точка находится внутри окружности).

Расчеты можно выполнять с помощью TikZ, но TeX не обеспечивает быстрых расчетов с действительными числами, поэтому для ускорения расчетов в этом случае методом прямого перебора лучше использовать другой язык программирования.

Например, скрипт Perl. Параметры изменяются в верхней части скрипта. Он выводит список точек, подходящих для plotкоманды рисования.

#!/usr/bin/env perl
use strict;
use warnings;

my ($ax, $ay, $ar) = (2, 2, 1);
my ($bx, $by, $br) = (10, 2, 3);

my ($ymin, $ymax) = (-4, 8);
my ($xmin, $xmax) = ($ax, $bx);

my ($xstep, $ystep) = (.01, .01);

sub circledistance ($$$$$) {
    my ($radius, $mx, $my, $x, $y) = @_;
    my $xdiff = $mx - $x;
    my $ydiff = $my - $y;
    my $result = sqrt($xdiff * $xdiff + $ydiff * $ydiff) - $radius;
    $result = -$result if $result < 0;
    return $result;
}

sub round ($) {
    my $value = shift;
    return int($value + .5);
}

my $xcount = round(($xmax - $xmin)/$xstep);
my $ycount = round(($ymax - $ymin)/$ystep);

my @points;
for (my $yi = 0; $yi <= $ycount; $yi++) {
    my $diff = 1000000;
    my $point = '';
    my $y = $ymin + ($ymax - $ymin)*$yi/$ycount;
    for (my $xi = 0; $xi <= $xcount; $xi++) {
        my $x = $xmin + ($xmax - $xmin)*$xi/$xcount;
        my $a = circledistance($ar, $ax, $ay, $x, $y);
        my $b = circledistance($br, $bx, $by, $x, $y);
        my $d = $a - $b;
        $d = -$d if $d < 0;
        if ($d < $diff) {
            $diff = $d;
            $point = "($x,$y)";
        }
    }
    push @points, $point;
}

print "$_\n" foreach @points;

1;
__END__

Далее код TeX:

\documentclass{article}

\usepackage{amsmath}
\usepackage{tikz}

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}
  \def\AX{2}
  \def\AY{2}
  \def\AR{1}
  \def\BX{10}
  \def\BY{2}
  \def\BR{3}
  \draw (\AX,\AY) circle (\AR cm);
  \draw (\BX,\BY) circle (\BR cm);
  \draw[red] plot[smooth] coordinates{
(4.16,-4)
(4.16,-3.99)
(4.16,-3.98)
(4.16,-3.97)
(4.16,-3.96)
(4.17,-3.95)
% ... <remaining lines of the output of the Perl script>
  };
\end{tikzpicture}
\caption{All points that are equidistant from both circles, lie on the
  hyperbola}
\end{figure}

\end{document}

Результат

решение2

Немного хрупкий (т. е. большие числа его сломают) и не учитывает угол между окружностями (поэтому они горизонтальны), но по сути он просто включает в себя перестановку теоремы косинусов.

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{math}
\begin{document} 
\begin{tikzpicture}
\tikzmath{%
  integer \i, \j;
  \r = 2;
  \R = 6;
  \c = \r + 4 + \R;
  {
     \draw (0, 0) circle [radius=\r];
     \draw (\c, 0) circle [radius=\R];
  };
  for \i in {1,...,50}{
    \C = 180 - 100 + \i*4;
    \Z = (\c^2 - \r^2 - \R^2 + 2 * \r*\R) / (2 * (1 - cos(\C)));
    \q = (-(\r+\R) + sqrt((\r+\R)^2 - 4 * (\r*\R - \Z))) / 2;
    \a = \q + \r;
    \b = \q + \R;
    \B = asin(\b * sin(\C) / \c);  
    { \coordinate (n-\i) at (\B:\a); };
    if (\i > 1) then {
      \j = \i - 1;
      { \draw (n-\j) -- (n-\i); };
    };
  };
}
\end{tikzpicture}
\end{document}

введите описание изображения здесь

решение3

Итак, вот простое решение, если вам не нужна идеальная парабола. Все дело в выборе подходящих координат для элементов управления, а также конечных точек параболической кривой. Рисование вспомогательной сетки и ее удаление в финальном прогоне может быть полезным в этой задаче.

\documentclass{article}
\usepackage{amsmath,tikz}
\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[line width=.7pt, scale=.7]
    \draw (2,2)  circle (1cm);
    \draw (2,-3) .. controls (6,1) and (6,3) .. (2,7);
    \draw (10,2) circle (3cm);
\end{tikzpicture}
\caption{All points that are equidistant from both circles, lie on the hyperbola}
\end{figure}

\end{document}

введите описание изображения здесь

решение4

Решение вычисления гиперболы. Не слишком сложно, и я полагаю, что автор знал, как это сделать. Радиусы и расстояние между окружностями такие же, как в исходном примере. Рисунок точный и настраиваемый, но,пусть покупатель будет бдителен: легко получить dimension too largeошибку при небольших изменениях.

Ниже (и в документе LaTeX) я добавлю небольшое пояснение по поводу используемых математических вычислений.

Код

\documentclass{article}
\usepackage{mathtools} % for the maths part (no needed for the picture)
\usepackage{cancel}    % ditto
\usepackage{tikz}

\begin{document}
\begin{figure}[ht]\centering
\begin{tikzpicture}[scale=0.9]
% parameters
\def\ra{1} % radius, left circle 
\def\rb{3} % radius, right circle
\def\dc{8} % distance between centers
% maths (explained below)
\pgfmathsetmacro\xa{-0.5*(\dc+\ra-\rb)} % placing the circles at the 
\pgfmathsetmacro\xb{ 0.5*(\dc-\ra+\rb)} % same distance form the origin
\pgfmathsetmacro\p{(\xb-\xa)/(\ra-\rb)}
\pgfmathsetmacro\q{(\xa*\xa-\xb*\xb-(\ra-\rb)*(\ra-\rb))/(2*(\ra-\rb))}
\pgfmathsetmacro\k{\p*\q+\xb}
\tikzset{declare function={
   fx(\x)=2*\k*cos(\x)*cos(\x)/(1-\p*\p*cos(\x)*cos(\x));    % hyperbola, x=rho(theta)*cos(theta)
   fy(\x)=2*\k*sin(\x)*cos(\x)/(1-\p*\p*cos(\x)*cos(\x));    % hyperbola, y=rho(theta)*sin(theta)
   dd(\x)=sqrt((fx(\x)-\xa)*(fx(\x)-\xa)+fy(\x)*fy(\x))-\ra; % distance from the hyperbola to A (or B)
}}
% circles
\draw[thick] (\xa,0) coordinate (A) circle (\ra);
\draw[thick] (\xb,0) coordinate (B) circle (\rb);
% hyperbola
\def\d{7} % domain
\draw[red,very thick] plot[domain=90-\d:90+\d] ({fx(\x)},{fy(\x)});
% tangent circles (not in the original picture)
\clip (\xa-2*\ra,{1-fy(90-\d)}) rectangle (\xb+\rb,{-1-fy(90+\d)});
\foreach\i in {-\d,...,\d}
{
  \coordinate        (aux) at (({fx(90+\i))},{fy(90+\i))});
  \draw[gray]        (aux) circle ({dd(90+\i)}) \ifnum\i=\d node[black,above] {$P(x,y)$}\fi;
  \draw[gray,dashed] (A)  -- (aux) -- (B);
  \draw[fill=white]  (aux) circle (0.5mm);
}
\foreach\i in {A,B}
  \draw[fill=white] (\i) circle (0.5mm) node[below] {$\i$};
\end{tikzpicture}
\caption{All points that are equidistant from both circles lie on the hyperbola.}
\end{figure}

% Ignore this if you don't need to know about the maths
\section{The maths}
The circle centers are $A(x_a,0)$, $B(x_b,0)$, and let $P(x,y)$ be a generic point at the hyperbola. Then,
\begin{align*}
d(P,A) & = d(P,B);\\
\sqrt{(x-x_a)^2+y^2}-r_a & =\sqrt{(x-x_b)^2+y^2}-r_b;\\
(x-x_a)^2+\cancel{y^2}   & =(x-x_b)^2+\cancel{y^2}+(r_a-r_b)^2+\\
& \phantom{{}={}}+2(r_a-r_b)\sqrt{(x-x_b)^2+y^2};\\
2(x_b-x_a)x+x_a^2-x_b^2+(r_a-r_b)^2 & =2(r_a-r_b)\sqrt{(x-x_b)^2+y^2};\\
\underbrace{\frac{x_b-x_a}{r_a-r_b}}_p x+\underbrace{\frac{x_a^2-x_b^2+(r_a-r_b)^2}{2(r_a-r_b)}}_q & = \sqrt{(x-x_b)^2+y^2};\\
(px+q)^2 & =(x-x_b)^2+y^2;\\
p^2x^2+2pqx+\cancel{q^2} & = x^2+y^2-2x_bx+\cancel{x_b^2};\\
\intertext{If we take the origin equidistant form both circles, we can cancel the constant terms. Now we change to polar coordinates, $x=\rho\cos\theta$, $y=\rho\sin\theta$.}
p^2\rho^2\cos^2\theta+2pq\rho\cos\theta & =\rho^2-2x_b\rho\cos\theta;\\
p^2\rho\cos^2\theta+2pq\cos\theta & =\rho-2x_b\cos\theta;\\
\rho & =\frac{2\overbrace{(pq+x_b)}^k\cos\theta}{1-p^2\cos^2\theta}=\frac{2k\cos\theta}{1-p^2\cos^2\theta}.
\end{align*}
\end{document}

Выход

введите описание изображения здесь

И математика

Центры окружностей — это A(x_a,0), B(x_b,0), и пусть P(x,y) — общая точка на гиперболе. Тогда,

введите описание изображения здесь

Если взять начало координат, равноудалённое от обеих окружностей, то можно сократить постоянные члены. Теперь перейдём к полярным координатам.

введите описание изображения здесь

Связанный контент