Mô hình đĩa Poincare

Lượt xem: 50

Description

Mô hình đĩa Poincare là ví dụ cơ bản trong Hình học đại số. Mô hình này gồm nhiều cung trắc địa, hiểu đơn giản là các cung của đường tròn trực giao với đĩa đường tròn ban đầu. Cảm ơn Nguyễn Thạc Dũng cho thông tin mô tả đĩa Poincare.

Mã TikZ

Cách vẽ đầu tiên (dùng thuần TikZ) của Lê Huy Tiễn và Bùi Quỹ

Cách vẽ thứ hai (dùng Tikz/PGF) của Lê Đình Mẫn.
********************************

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
% by Le Huy Tien - VNU
\documentclass[border=5mm]{standalone}
\usepackage[english,ngerman]{babel}
\usepackage{tikz,tkz-euclide}
\usetkzobj{all}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[line join=round, line cap=round]
\def\R{3
} % bán kính đường tròn lớn
\def\qone{110} % góc bắt đầu của cung trắc địa
\def\qtwo{160} % góc kết thúc của cung trắc địa
\pgfmathsetmacro{\f}{(\qtwo-\qone)/2}
\pgfmathsetmacro{\dq}{abs(\f)}
\pgfmathsetmacro{\r}{\R*tan(\dq)}
\pgfmathsetmacro{\rp}{sqrt(\r*\r+\R*\R)
} % bán kính cung
\draw[gray] (0,0) circle(\R)
(\R+1,0)--(-\R-1,0)
(0,\R+1)--(0,-\R-1);
\coordinate[label=below right:$O$] (O) at (0,0);
\coordinate (A) at (\qone:\R);
\coordinate (B) at (\qtwo:\R);
\coordinate[label=above left:$I$] (I) at (\f+\qone:\rp);
\path (A) node[shift={(70:9pt)}]{$A$}
node[shift={(-30:10pt)},magenta]{$q_1$}
(B) node[shift={(200:9pt)}]{$B$}
node[shift={(-60:10pt)},magenta]{$q_2$};
\draw[green] (I)--node[midway,left,magenta]{$r$}(B)
--node[pos=.4,below, magenta]{$R$}(O)
--(I)--(A)--(O);
\draw[gray] (I) circle(\r);
\tkzDrawArc[towards,color=blue, thick](I,B)(A)
\end{tikzpicture}
\end{document
}
******************************
% by Le Huy Tien + Bui Quy
\documentclass[border=5mm]{standalone}
\usepackage[english,ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\geodesicarc}[4]
{
\def\R{#1
} % bán kính đường tròn lớn
\def\qone{#2} % góc bắt đầu của cung trắc địa
\def\qtwo{#3} % góc kết thúc của cung trắc địa
\def\geodesiccolor{#4} % màu nét vẽ của cung trắc địa
\pgfmathsetmacro{\f}{(\qtwo-\qone)/2}
\pgfmathsetmacro{\dq}{abs(\f)}
\pgfmathsetmacro{\r}{\R*tan(\dq)
} % bán kính cung trắc địa
\pgfmathsetmacro{\rp}{sqrt(\r*\r+\R*\R)} % khoảng cách tâm 2 đường tròn
\coordinate (A) at (\qone:\R);
\coordinate (B) at (\qtwo:\R);
\coordinate (I) at (\f+\qone:\rp);
\fill [color=\geodesiccolor] (I) circle (\r);
}% hết lệnh
\begin{document}
\begin{tikzpicture}
\def\RR{3
} % bán kính đường tròn lớn
\colorlet{mauto}{blue} % màu tô đĩa Poincare
\clip (0:0) circle (\RR);
\fill[mauto] (0,0) circle (\RR);
% Khởi tạo tam giác trắc địa
\foreach \i in {-30,90,210}
\geodesicarc{\RR}{\i}{\i+120}{white
};
% Bước lặp thứ 1
\foreach \i in {-30,30,...,330}
\geodesicarc{\RR}{\i}{\i+60}{mauto
};
% Bước lặp thứ 2
\foreach \i in {-30,0,...,330}
\geodesicarc{\RR}{\i}{\i+30}{white
};
% Bước lặp thứ 3
\foreach \i in {-30,-15,...,345}
\geodesicarc{\RR}{\i}{\i+15}{mauto
};
% Bước lặp thứ 4
\foreach \i in {-30,-22.5,...,352.5}
\geodesicarc{\RR}{\i}{\i+7.5}{white
};
% Bước lặp thứ 5
\foreach \i in {-30,-26.25,...,356.25}
\geodesicarc{\RR}{\i}{\i+3.75}{mauto
};
% Bước lặp thứ 6
\foreach \i in {-30,-28.125,...,358.125}
\geodesicarc{\RR}{\i}{\i+1.875}{white};
\draw[gray] (0,0) circle(\RR);
\end{tikzpicture}
\end{document
}
***************************
% by Le Dinh Man
\begin{tikzpicture}[scale=.5]
\def\Rm{5cm}
\def\n{6}
\coordinate (O) at (0,0);
\coordinate (A) at (0,\Rm);
\clip (O)circle(\Rm);
\fill[blue!50!purple] (O)circle(\Rm);
\foreach \x in {1,...,\n}{
\pgfmathparse{Mod(\x,2)==0?1:0}
\ifnum\pgfmathresult>0
\def\mau{blue!50!purple}
\else
\def\mau{cyan!30}
\fi
\pgfmathsetmacro\k{pow(2,\x-1)}
\pgfmathsetmacro\m{3*\k}
\foreach \i [evaluate=\i as \j using 120*\i/\k+60/\k] in {1,...,\m}{
\coordinate (A\i) at ($(O)!\Rm/cos(60/\k)!\j:(A)$);
\fill[\mau] (A\i)circle({\Rm*tan(60/\k)});
}
}
\draw[thick,blue!50!purple] (O)circle(\Rm);
\end{tikzpicture
}

Mã Asymptote

Tác giả: Huỳnh Văn Thơ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//settings.outformat="png";
//settings.render = 10;
import geometry;
unitsize(3cm);
//==== Độ dày của line
defaultpen(linewidth(.7pt));
//==== Đường tròn ngoài cùng
point O=(0,0);
real r=5;
circle c=circle(O,r);
draw(c);
//=== Định nghĩa cung trực giao với đường tròn c cho trước
path arcex(circle c, pair A, pair B){
line t[]=tangents(c,A);
line tt[]=tangents(c,B);
line t1=t[0];
line t2=tt[0];
circle cc=circle(intersectionpoint(t1,t2),abs(intersectionpoint(t1,t2) -A));
return arc(cc,A,B);
}
//======= 3 cung đầu
point A[];
path a[];
path p;
for(int i=1;i<=2;++i){A[i]=angpoint(c,i*120+90);}
a[1]=arcex(c,A[2],A[1]);
for(int i=1;i<=2;++i){a[i+1]=rotate(120,O)*a[i];}
p=buildcycle(a[1],a[2],a[3]);
fill(p,black);
//============ Định nghĩa vòng lặp
path poincare(int n){
int u(int x){return 3*2^(x-1);}
point D[];
path d[];
for(int i=1;i<=2;++i){D[i]=angpoint(c,i*360/u(n)+90);}
d[1]=arcex(c,D[2],D[1]);
//============
point E[];
path e[];
for(int i=1;i<=u(n+1)-1;++i){E[i]=angpoint(c,i*360/u(n+1)+90);}
for(int i=1;i<=2;++i){e[i]=arcex(c,E[i+2],E[i+1]);}
return buildcycle(e[1],e[2],d[1]);
}
int m=5; // Nhập từ 1 trở đi.
for(int i=2; i<=2*m; i+=2){
int u(int n){return 3*2^(n-1) ;}
for(int j=0; j<=u(i); ++j){
fill(rotate(j*360/u(i),O)*poincare(i));
}
}