
Quero fazer uma hipérbole que hospede os pontos que estão à mesma distância de dois círculos. Não estou realmente interessado na precisão, mas sim em uma figura que dê aos alunos uma ideia. Aqui está o meu código:
\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}
Você pode por favor ajudar?
Responder1
O exemplo a seguir examina a área da imagem (parte dela) linha por linha, de baixo para cima, para encontrar oxposição, onde as distâncias entre o ponto atual e os círculos têm a diferença mínima. A distância de um ponto pode ser calculada subtraindo o raio da distância do ponto atual ao centro do círculo (e tomando o valor absoluto para o caso, o ponto atual está dentro do círculo).
Os cálculos podem ser feitos com TikZ, mas o TeX não fornece cálculos rápidos com números reais, portanto, uma linguagem de programação diferente seria melhor para agilizar os cálculos neste caso de cálculos de força bruta.
Por exemplo, um script Perl. Os parâmetros são modificados na área superior do script. Ele gera uma lista de pontos adequados para o plot
comando de desenho.
#!/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__
Então o código 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}
Responder2
Um pouco frágil (ou seja, números grandes irão quebrá-lo) e não leva em consideração o ângulo entre os círculos (portanto, eles são horizontais), mas principalmente envolve apenas um rearranjo da regra do cosseno.
\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}
Responder3
Então, aqui está uma solução simples se você não se importa com uma parábola perfeita. Trata-se de escolher as coordenadas adequadas para os controles, bem como os pontos finais da curva parabólica. Desenhar uma grelha auxiliar e removê-la numa execução final pode ser útil nesta tarefa.
\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}
Responder4
Uma solução para calcular a hipérbole. Não é muito difícil e suponho que o OP sabia como fazê-lo. Os raios e a distância entre os círculos são iguais aos do exemplo inicial. A figura é precisa e personalizável, mas,caveat emptor: é fácil obter um dimension too large
erro com pequenas alterações.
Abaixo (e no documento LaTeX) adicionarei uma pequena explicação sobre a matemática envolvida.
O código
\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 saída
E a matemática
Os centros do círculo são A(x_a,0), B(x_b,0) e seja P(x,y) um ponto genérico na hipérbole. Então,
Se tomarmos a origem equidistante de ambos os círculos, podemos cancelar os termos constantes. Agora mudamos para coordenadas polares.