Thứ Hai, 18 tháng 8, 2025

Vẽ chuỗi đường tròn papus bằng metapost

Trong đoạn code metapost dưới đây ta xây dựng một hàm để tìm ảnh của đường tròn qua phép nghịch đảo.

Đầu tiên ta tìm hiểu định nghĩa phép nghịch đảo cực $I$ phương tích $k \ne 0$ trong mặt phẳng như sau:
Hai điểm P và P' được gọi là tương ứng của nhau trong phép $\rm NĐ(I,k)$ nếu $I, P, P'$ thẳng hàng và $\overline{IP}.\overline{IP'}=k$.

Nếu $k>0$, đường tròn tâm $I$ bán kính $\sqrt{k}$ gồm toàn những điểm bất biến (hay còn gọi bất động, hay điểm kép) và được gọi là đường tròn nghịch đảo.


Trong metapost ta định nghĩa phép nghịch đảo như sau:


vardef invert(expr P, C) = 
save I, r, s, T; 
pair I; 
I = center C; 
r = abs(point 0 of C-I);
if pair P: s = abs(P-I); I if s > eps: + (P-I) / s * r / s * r fi
elseif path P: T = length P; for t=0 upto T-1: invert(point t of P, C) .. 
endfor
if cycle P: cycle else: invert(point T of P, C) fi
fi
enddef;

THỰC HÀNH PHÉP NGHỊCH ĐẢO VẼ ẢNH CỦA ĐƯỜNG TRÒN


  1. Copy đoạn code ở trên dán vào một file metaposst, đặt tên là pnd.mp, lưu tại một thư mục làm việc.
  2. Soạn một file TeX để vẽ 3 đường tròn: đường tròn nghịch đảo (tức là đường tròn tâm $O$ bán kính $AC$), đường tròn đường kính $AC$ như sau:
    \documentclass[border=5mm]{standalone}
    \usepackage{luamplib}
    \begin{document}
    \mplibtextextlabel{enable}
    \begin{mplibcode}
    input pnd
    beginfig(1);
        pair A,B,C;
        numeric r; 
        A = origin;
        C = (10cm,0);
        r = 3/4;
        B = r[A,C];
        path c[];
        c1 = fullcircle scaled 2 abs(A-C);     % đường tròn  nghịch đảo
        c2 = fullcircle scaled abs(A-C) shifted 1/2[A,C];
        c3 = fullcircle scaled abs(A-B) shifted 1/2[A,B];
    %   draw subpath(-1,1) of c1 withpen pencircle scaled .5;
        draw  c2 withcolor red withpen pencircle scaled 3bp;;
        draw  c3 withcolor blue withpen pencircle scaled 3bp;
        draw A--C;
        dotlabel.lft("$A$", A);
        dotlabel.llft("$B$", B);
        dotlabel.rt("$C$", C);
    endfig;
    \end{mplibcode}
    \end{document}

    Từ dòng 10 đến dòng 15 khai báo các điểm và hằng số.
    Từ dòng 16 đến dòng 20 xác định (khai báo) các đường tròn.
    Từ dòng 21 đến dòng 23 vẽ hai đường tròn và đường thẳng $AC$.

  3. Viết thêm vào sau dòng 26 (trước \endfig) để vẽ đường tròn đường kính $BC$ và ảnh của nó qua PNĐ như sau:
     c4 = fullcircle scaled abs(B-C) shifted 1/2[B,C];
     c5 = invert(c4,c1);
     draw  c4  withpen pencircle scaled 2bp;
     draw  c5   withpen pencircle scaled .5bp;
     

     

  4. Đặt đường kính của đường tròn $c_5$ là $d$. Dùng phép tịnh tiến theo vectơ cùng hướng với tia có gốc tại $C$, vuông góc với đường thẳng $AC$ và có độ dài lần lượt bằng $d, 2d, 3d, \dots 42d$, sau đó theo hướng ngược lại, như vậy ta có tất cả 84 đường tròn. Dùng PNĐ vẽ ảnh của 84 đường tròn này.
    numeric d; d = abs(point 0 of c5-point 4 of c5);
    for i=-42 upto 42:
            draw invert(c5 shifted (0,i*d), c1) withcolor red 
            withpen pencircle scaled 1bp;
    endfor
    


File $\rm Lua\LaTeX$ hoàn chỉnh


\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
input pnd
beginfig(1);
     pair A,B,C;
    numeric r; 
    A = origin;
    C = (10cm,0);
    r = 3/4;
    B = r[A,C];
    path c[];
    c1 = fullcircle scaled 2 abs(A-C);     % đường tròn  nghịch đảo
    c2 = fullcircle scaled abs(A-C) shifted 1/2[A,C];
    c3 = fullcircle scaled abs(A-B) shifted 1/2[A,B];
    c4 = fullcircle scaled abs(B-C) shifted 1/2[B,C];
    c5 = invert(c4,c1);
% draw subpath(-1,1) of c1 withpen pencircle scaled .5;
    draw  c2 withcolor red withpen pencircle scaled 3bp;;
    draw  c3 withcolor blue withpen pencircle scaled 3bp;
    draw  c4  withpen pencircle scaled 2bp;
    draw  c5   withpen pencircle scaled .5bp;
    draw A--C;
    dotlabel.lft("$A$", A);
    dotlabel.llft("$B$", B);
    dotlabel.rt("$C$", C);
numeric d; d = abs(point 0 of c5-point 4 of c5);
for i=-42 upto 42:
        draw invert(c5 shifted (0,i*d), c1) withcolor red 
        withpen pencircle scaled 1bp;
endfor
endfig;
\end{mplibcode}
\end{document}

Không có nhận xét nào:

Đăng nhận xét