
Quiero hacer una hipérbola que aloje los puntos que tienen la misma distancia de dos círculos. Realmente no me interesa la precisión, sino más bien una cifra que les dé a los estudiantes una idea. Aquí está mi 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}
¿Puedes ayudarme?
Respuesta1
El siguiente ejemplo escanea el área de la imagen (parte de ella) línea por línea de abajo hacia arriba para encontrar elXposición, donde las distancias entre el punto actual y los círculos tienen la diferencia mínima. La distancia desde un punto se puede calcular restando el radio de la distancia del punto actual al centro del círculo (y tomando el valor absoluto para el caso, el punto actual está dentro del círculo).
Los cálculos se pueden hacer con TikZ, pero TeX no proporciona cálculos rápidos con números reales, por lo que sería mejor un lenguaje de programación diferente para acelerar los cálculos en este caso de cálculos de fuerza bruta.
Por ejemplo, un script Perl. Los parámetros se modifican en el área superior del script. Genera una lista de puntos adecuados para el plot
comando de dibujo.
#!/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__
Luego el 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}
Respuesta2
Un poco frágil (es decir, los números grandes lo romperán) y no tiene en cuenta el ángulo entre los círculos (por lo que son horizontales), pero sobre todo implica una reorganización de la regla del coseno.
\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}
Respuesta3
Entonces, aquí tienes una solución simple si no te importa una parábola perfecta. Se trata de elegir las coordenadas adecuadas para los controles, así como los puntos finales de la curva parabólica. En esta tarea puede resultar útil dibujar una cuadrícula de ayuda y eliminarla en una ejecución final.
\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}
Respuesta4
Una solución que calcula la hipérbola. No es demasiado difícil y supongo que el OP sabía cómo hacerlo. Los radios y la distancia entre círculos son los mismos que en el ejemplo inicial. La cifra es precisa y personalizable pero,advertencia emptor: es fácil obtener un dimension too large
error con pequeños cambios.
A continuación (y en el documento LaTeX) agregaré una pequeña explicación sobre las matemáticas involucradas.
El 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}
La salida
y las matematicas
Los centros del círculo son A(x_a,0), B(x_b,0), y sea P(x,y) un punto genérico en la hipérbola. Entonces,
Si tomamos el origen equidistante de ambos círculos, podemos cancelar los términos constantes. Ahora cambiamos a coordenadas polares.