Как нарисовать инверсию круга в TikZ?

Как нарисовать инверсию круга в TikZ?

Инверсия точки P и центра O — это другая точка P' вдоль линии OP, такая, что произведение OP. OP' = k, то есть константа k. Инверсия окружности точкой O (не лежащей в окружности) — это другая окружность, как на рисунке ниже. Инверсия круга

Можно ли нарисовать второй круг в TikZ как (правильную) инверсию первого? Я знаю, что легко делать переносы, вращения и другие линейные преобразования... но никогда не видел инверсии.

решение1

Пока вы ждете решения TikZ, вот простой способ сделать свою диаграмму вМетапост. Базовая геометрия хорошо объяснена.на Mathworld, (хотя диаграмма там показывает инверсию точкиснаружикруг инверсии; в данном случае роли Pи P'меняются местами, поскольку Pнаходится внутри круга инверсии).

Здесь я добавил контур части круга инверсии бледно-розового цвета, чтобы сделать более очевидным, как это работает. Конечно, вы можете удалить розовую дугу, если она не нужна.

Круг с инверсией

prologues := 3;
outputtemplate := "%j%c.eps";

vardef invert_point(expr p, k) = 
  if abs(p)>0:
    unitvector p scaled (k/abs(p)) scaled k
  else:
    origin % strictly this should be a point at infinity
  fi
enddef;

vardef invert_path(expr P, k) = 
  for t=0 step 1/16 until length P-1/16:
     invert_point(point t of P, k) --
  endfor
  if cycle P:
     cycle
  else:
     invert_point(point infinity of P, k)
  fi
enddef;

beginfig(1);

path C, C'; 
pair P, P', Q; 

k = 150;
draw subpath (-1.4,1.4) of fullcircle scaled 2k withcolor .8[red,white];

C = fullcircle scaled 72 shifted 100 right;
P = point 1 of C;
C' = invert_path(C, k);
P' = invert_point(P, k);
Q = (origin -- P) intersectionpoint subpath (2,4) of C;

draw origin -- P';
draw origin -- center C' withcolor .5 white;
draw P'     -- center C' withcolor .5 white;
draw Q      -- center C  withcolor .5 white;

draw C; 
draw C' withcolor .78 blue; 

fill fullcircle scaled 3;
fill fullcircle scaled 3 shifted P;
fill fullcircle scaled 3 shifted Q;
fill fullcircle scaled 3 shifted P';
fill fullcircle scaled 3 shifted center C;
fill fullcircle scaled 3 shifted center C';

label(btex $O$  etex, origin + (-6,3));
label(btex $P$  etex, P      + (+3,7));
label(btex $P'$ etex, P'     + (-3,7));
label(btex $Q$  etex, Q      + (-3,7));
label(btex $C$  etex, point 5.5 of C + (-3,-7));

endfig;
end

Примечания

  • Для простоты invert_pointпредположим, что центр окружности инверсии находится в начале координат. Но не составит труда адаптировать подпрограмму для принятия произвольной окружности вместо радиуса k.

  • Опять же, для простоты я привел здесь две разные функции для a pathи для a, pointно вы можете легко написать одну invertфункцию и использовать if path Pи if pair Pдля выбора правильного действия в соответствии с тем, что вы ей передали.

  • Выражение unitvector p scaled (k/abs(p)) scaled kможет быть более естественно записано как unitvector p scaled (k**2/abs(p)), но вы получите ошибку арифметического переполнения, если установите kзначение больше 181. Это потому, что 182**2это больше, чем 2**15наибольшее число, которое позволяет обычный MP. Чтобы избежать этого, либо закодируйте его так, как я показал, либо используйте mpost -numbersytem=doubleдля его обработки.

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

решение2

Я рассчитал это в Tikz следующим образом.

Во-первых, есть две разные инверсии:

  1. точка находится внутри круга инверсии;
  2. суть находится вне его.

Я начну со второго случая. Я нарисую окружность с центром в точке «O» (называемой «k») и найду точку инверсии точки «P» вне окружности «k».

Первое, что вам нужно знать, это одна из точек касания от "P" к "k". Проекция этой точки на линию "OP" является точкой инверсии "P".

\documentclass{article}
\usepackage{tikz}
    \usetikzlibrary{calc}
    \usetikzlibrary{intersections}
    \begin{document}
    \begin{tikzpicture}
        \coordinate (O) at (0,0);
        \coordinate (P) at (5,0);
        \draw[red,thick,name path=circ1](O)circle(2);
        %
        % I look for the midpoint of O and P. This point will be the centre of
        % an arc whose intersection with k will give me the tangent points
        %
        \path(O)--coordinate[midway](M)(P);
        %
        % I draw the arc whose intersection with circle are the 2 tangent points
        %
        \path[name path=circ2] let
            \p1=(O),
            \p2=(M),
            \n1={veclen(\x2-\x1,\y2-\y1)} in
            ($(M)+({\n1*cos(130)},{\n1*sin(130)})$) arc (130:230:\n1);
        \path[name intersections={of=circ1 and circ2}]
            (intersection-1) coordinate (Tg1)
            (intersection-2) coordinate (Tg2);
        \draw[blue]
            (A)--(Tg1)
            (O)--node[midway,left,black]{$\mathtt{r}$}(B)
            (O)--(A);
        %
        % Here we are. This projection is the inversion of point P with regards
        % to circle k
        %
        \draw[orange](Tg1)--($(O)!(Tg1)!(P)$)coordinate(InvP);
        %
        \draw[black,line width=.75,fill=white]
            (P)circle(1.5pt)node[black,below]{$\mathtt{P}$};
        \draw[black,line width=.75,fill=white]
            (O)circle(1.5pt)node[black,below]{$\mathtt{O}$};
        \draw[black,line width=.75,fill=white]
            (Tg1)circle(1.5pt)node[black,below]{$\mathtt{Tg1}$};
        \draw[black,line width=.75,fill=white]
            (InvP)circle(1.5pt)node[black,below]{$\mathtt{P'}$};
        \node at (-1.75,0) {$\symtt{k}$};
    \end{tikzpicture}
\end{document}

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

Когда точка находится внутри окружности, все, что нам нужно сделать, это найти перпендикулярную прямую из OP, найти пересечение этой прямой с окружностью k (назовем ее TgP), провести касательную из этой точки и найти ее пересечение с OP.

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