Điều kiện để đường thẳng Δ: Ax By C+ + = 0 tiếp xúc với đường tròn C là: Có thể giải thích công thức này bằng cách dùng diện tích hình chữ nhật như sau: Diện tích tam giác bằng một nửa
Trang 1CHUYÊN ĐỀ BỒI DƯỠNG HỌC SINH GIỎI MÔN TIN HỌC
CHUYÊN ĐỀ HÌNH HỌC
MÃ: TI08
Để đáp ứng được yêu cầu của công tác giảng dạy đội tuyển Tin học Bản thân mỗi giáo viên chúng ta luôn phải tìm tòi, nghiên cứu, trao đổi kiến thức và kinh nghiệm giảng dạy với các đồng nghiệp Bên cạnh đó, nguồn tài liệu trên mạng cũng
là một nguồn quý giá đối với giáo viên chúng ta Tuy nhiên, việc tổng hợp, biên tập thành tài liệu có nội dung phù hợp cho đối tượng học sinh của mình lại là một vấn đề quan trọng hơn nữa
Vì vậy, với chuyên đề này tôi xin được đề cập đến một tài liệu được sưu tầm
mà tôi thường dùng để giảng dạy cho học sinh trong đội tuyển, những bài toán mà bản thân tôi thấy tâm đắc Nguồn đề và bài giải trong chuyên đề này được tôi sưu tầm từ: spoj, laptrinh.ntu, kienthuc24h
Tài liệu này bố cục thành hai phần:
• Kiến thức hình học cơ bản
• Hệ thống bài tập quan trọng về hình học
Trang 2
2 a a auur( 1 ; 2 ) ⇔aur=a i a j1ur+ 2uur; M(x;y)⇔OMuuuuur=xiur+y juur
3 Tọa độ của vectơ: cho u x y v x yr( ; ), ( '; ')r
II Phương trình đường thẳng
1 Một đường thẳng Δ được xác định khi biết một điểm M(x0;y0) và một vectơ pháp tuyến nr=(A B; ) hoặc một vectơ chỉ phương ar=( )a b;
III Phương trình đường tròn
1 Một đường tròn được xác định khi biết tâm I(a;b) và bán kính r
Phương trình:
a n
Δ
(C)
r Δ
I
M
Trang 3Dạng 1: ( ) (2 )2 2
x a− + −y b =r Dạng 2: x2 +y2 − 2ax− 2by d+ = 0, điều kiện a2 +b2 − >d 0 và r = a2 + −b2 d
2 Điều kiện để đường thẳng Δ: Ax By C+ + = 0 tiếp xúc với đường tròn (C) là:
Có thể giải thích công thức này bằng cách dùng diện tích hình chữ nhật như sau:
Diện tích tam giác bằng một nửa diện tích hình bình hành, diện tích hình bình hành bằng diện tích một hình chữ nhật
Từ một tam giác (màu xanh lá cây), ta sao một tam giác bằng nó,(màu xanh lam), quay góc 180°, và ghép chúng thành hình bình hành Cắt một phần của hình bình
hành, ghép lại thành hình chữ nhật Vì diện tích hình chữ nhật là bh, nên diện tích tam giác là ½bh
Nói cách khác, diện tích tam giác bằng độ dài cạnh đáy nhân với chiều cao chia 2:
- Dùng vectơ
Diện tích hình bình hành là tích có hướng của hai vectơ
Nếu tứ giác ABDC là hình bình hành thì diện tích của nó được tính bởi công thức:
trong đó là tích có hướng của hai vectơ và
Diện tích tam giác ABC bằng một nửa diện tích của hình bình hành ABDC nên:
Trang 4- Dùng lượng giác
Sử dụng lượng giác để tính diện tích tam giác
- Dùng tọa độ
Nếu đỉnh A đặt ở gốc tọa độ (0, 0) của hệ tọa độ Descartes và tọa độ của hai đỉnh kia
là B = (xB, yB) và C = (xC, yC), thì diện tích S của tam giác ABC bằng một nửa của giá
trị tuyệt đối của định thức
Trong trường hợp tổng quát, ta có:
Trong không gian ba chiều, diện tích của tam giác cho bởi {A = (xA, yA, zA),
B = (xB, yB, zB) và C = (xC, yC, zC)} là tổng 'Pythagor' của các diện tích các hình chiếu
của chúng trên các mặt phẳng tọa độ (nghĩa là x=0, y=0 and z=0):
- Dùng công thức Heron
Cũng có thể tính diện tích tam giác S theo Công thức Heron:
trong đó là nửa chu vi của tam giác
V Đa giác lồi
Trang 51 Số đường chéo trong một đa giác lồi có N đỉnh: !(!!!)!
các đỉnh là 3 đỉnh phân biệt trong số n điểm này (bao gồm cả những tam giác bị suy biến, nghĩa là khi cả 3 đỉnh thẳng hàng)
3 Tổng khoảng cách từ 1 điểm trong tứ giác đến các đỉnh bé nhất bằng tổng hai đường chéo
4 Chứng minh rằng qua điểm (a, b) có thể dựng được một đường thẳng cắt góc tọa
độ thứ nhất tạo thành một tam giác vuông, sao cho trong hoặc trên cạnh của tam giác
5 công thức tính diện tích đa giác lồi theo tọa độ đỉnh là:
S = |∑(xⁿ+¹ - xⁿ)(yⁿ+¹ + yⁿ)/2|
Hoặc: S = |∑(xⁿ+¹ + xⁿ)(yⁿ+¹ - yⁿ)/2|
Trong đó n chạy từ 1 đến số đỉnh của đa giác, đỉnh thứ n+1 coi là đỉnh 1
VI Điểm, đường thẳng, đoạn thẳng
vì vậy khi xét tới toạ độ của P(x,y) thì ta xét P.x, P.y
Chúng ta biết khoảng cách giữa hai điểm P(x1,y1)và Q(x2,y2) trong mặt phẳng:
Function Khoang_Cach(P,Q: Point_Chung ) : Real ;
Ax + By + C = 0, đi qua 2 điểm A (x1,y1) và B(x2,y2) thì nó có:
A:= y1- y2;
B:= x2 – x1;
Trang 62 Phương trình tương quan giữa điểm và đường thẳng, đoạn thẳng:
a Tương quan giữa điểm và đường thẳng:
Cho đường thẳng (d) có phương trình: Ax +By + C = 0 và P(x,y)
Thì phương trình:
F(x,y) = A*P.x + B*P.y + C, là phương trình tương quan của P với (d) Đúng vậy:
* Nếu F (x,y)=0 thì P thuộc (d) Ngược lại nếu F(x,y)<>0 thì P không thuộc (d)
* Nếu Q (x1,y1) mà nằm cùng phía không thuộc (d) thì F (x1,y1)*F(x,y)>0, và nếu khác phía thì F(x1,y1)*F(x,y)<0 Đây là một trong những điều kiện giúp ích cho ta rất nhiều trong giải toán tin hình học và cũng là một phương tiện thiết kế chương trình trong hình học dẽ dàng hơn
Chúng ta xây dựng hàm Phuong_Trinh để xác định mối tương quan của đường thẳng với một điểm:
Function Phuong_trinh (L : Lines ; P : Point_Chung ) : Real ;
Begin
Phuong_Trinh:=L.a*P.x+L.b*P.y+L.c;
End ;
b Tương quan của điểm với đoạn thẳng
Chúng ta biết rằng, đoạn thẳng là một phần đường thẳng Nên mối tương quan giữa điểm P(x,y) với đoạn thẳng AB, (A (x1,y1), B(x2,y2)) là:
– Nếu P[AB] thì:
Trang 7+ F(x,y)=0, tức là: a*x+b*y+c=0, với a=y1-y2; b=x2-x1 và c=- (a*x1+b*y1)
+ (x-x1)*(x-x2)<=0 và (y-y1)*(y-y2)<=0
– Nếu P[AB] thì:
+ Nếu F(x,y)=0 thì: (x-x1)*(x-x2)>0 hoặc (y-y1)*(y-y2)>0
+ Nếu F(x,y)<>0 thì P không thuộc đường thẳng qua A, B
Ta có thể xây dựng hàm kiểm tra 1 điểm P có thuộc đoạn AB như sau:
Function thuoc_doan ( P : Point_Chung ; A, B : Point ) : Boolean ;
Var a , b , c : longint ; t : Real ;
* Hai đường thẳng song song với nhau khi và chỉ khi: D=0 và Dx ≠ 0 hoặc Dy ≠ 0
* Hai đường thẳng trùng nhau khi: D=Dx=Dy=0
Chúng ta có thể xây dựng hàm kiểm tra cắt nhau của hai đường thẳng
Hàm Lines_Cut có giá trị:
1: Nếu hai đường thẳng đó cắt nhau
2: Nếu hai đường thẳng đó song song nhau
3: Nếu hai đường thẳng đó trùng nhau
Function Lines_cut ( L1 , L2 : Lines ) : Byte ;
Trang 8var D, Dx,Dy : Longint ;
Mối quan hệ giữa (1) và AB được thể hiện:
* Nếu D ≠ 0 và điểm P(Dx/D,Dy/D) nằm trên đoạn AB thì (1) cắt AB
* Nếu D ≠ 0 và điểm P(Dx/D,Dy/D) nằm ngoài đoạn AB thì (1) cắt đường thẳng chứa AB nhưng không cắt AB
* Nếu D=Dx=Dy=0 thì AB(1)
* Nếu D=0, Dx/D0 hoặc Dy/D0 thì AB song song với (1)
Chúng ta xây dựng hàm: Lines_Cut_AB
Lines_Cut_AB bằng:
1: Nếu đoạn thẳng cắt đường thẳng
2: Nếu đoạn thẳng song song với đường thẳng
3: Nếu đoạn thẳng thuộc đường thẳng
4: Nếu đường thẳng chứa đoạn thẳng cắt đường thẳng một điểm nằm ngoài đường thẳng
Function Lines_Cut_AB (L1:Lines ; P,Q : Point ): Byte;
Trang 9Cách 1:
Cách Theo Phương Trình Đường Thẳng:
Function Cat_Nhau1 (P,Q,M,N: Point) : Boolean ;
(Tham khảo sách Cẩm nang thuật toán - tập 2)
Function ccw ( P0 , p1 , p2 : Point ) : Integer ;
Var Dx1,Dx2,Dy1,Dy2: Integer ;
Begin
Dx1 := P1 x -P0.x ;
Trang 10S:=Sqrt((p-a)*(p-b)*(p-c)*p);
Trong đó a, b, c là độ dài ba cạnh của tam giác P=(a+b+c)/2;
b Hình chữ nhật: (trường hợp cho cách cạnh song song các trục toạ độ)
Chúng ta xét trong hệ tọa độ một hình chữ nhật ABCD, A (x1,y1); B(x2,y2); C(x3,y3); D (x4,y4)
Nhưng có một điều đặc biệt là chúng ta chỉ cần xác định toạ độ đỉnh của hai đỉnh đối nhau thì xác định đợc một hình chữ nhật duy nhất Chính vì thế thông thường chúng
ta gọi toạ độ của điểm dưới trái và đỉnh trên phải là hai điểm đặc trưng cho hình chữ nhật đó
c Hình đa giác:
Một đa giác A1A2…An có toạ độ: Ai (xi ,yi)
Trang 11* Người ta định nghĩa đa giác đó là lồi khi mọi điểm còn lại của đa giác nằm cùng
phía với nhau so với một cạnh nào đó
* Diện tích một đa giác được tính theo công thức hình thang như sau:
S : = |[(Xi-Xi+1)*(Yi+Yi+1)/2]|
d Bao lồi:
Bao lồi của một tập điểm là một hình đa giác khép kín có các đỉnh là một trong các
đỉnh của tập điểm đó, và thoả mãn đa giác lồi Thông thường chúng ta cần phải tìm
đa giác bao với chu vi nhỏ nhất Có nhiều thuật toán để giải quyết bài toán này Đặc
biệt phương pháp quét:
Phương pháp quét đường thẳng:
Chúng ta đi từ một đỉnh chắc chắn thuộc bao lồi (là những điểm có tung độ hoành độ
lớn nhất hoặc nhỏ nhất) Chúng ta tìm các đỉnh tiếp theo, đỉnh nào thoả mãn chứa
toàn bộ các đỉnh còn lại một bên mặt phẳng thì ta lấy điểm đó cho đến khi lặp lại
điểm ban đầu
Procedure Scan;
Begin
Xác định thuộc đa giác ;
Repeat
tìm đỉnh tiêp theo mà thoả mãn điều kiện lồi của đa giác ;
Until lặp lại đỉnh ban đầu ;
End ;
Nội dung về bao lồi là phức tạp tôi xin đề cập vào dịp khác
Với hệ thống kiến thức cơ sở như trên, đây sẽ là cẩm nang hữu ích cho học
sinh khi làm bài tập về chuyên đề hình học Phần nội dung này, tôi thường tạo thành
ebook và giao cho học sinh tự nghiên cứu và sử dụng trong quá trình làm bài
Trang 12B HỆ THỐNG BÀI TẬP QUAN TRỌNG VỀ HÌNH HỌC
B1 Mức cơ bản
Nội dung bài tập ở mức này giúp học sinh làm quen với các bài tập về hình học
và sử dụng ebook để tra cứu công thức cũng như tính chất của các hình Nguồn bài tập và lời giải do tôi code, sưu tầm trên spoj và kienthuc24h
1 Tam giác vuông – PTIT138A
Chúng ta đều biết định lý Pitago nổi tiếng về tam giác vuông Bài toán đặt ra là cho trước độ dài 3 cạnh của một tam giác Hãy xác định xem đó có phải tam giác vuông hay không?
Input
Gồm nhiều bộ test Mỗi bộ test viết trên một dòng 3 số nguyên dương không quá
30000, lần lượt là độ dài ba cạnh của tam giác
Procedure xuli(ii:longint;s1: string);
var j,a,b,k: longint;
end
Trang 132 Điểm còn lại của hình chữ nhật - PTIT124H
Cho một hình chữ nhật có cạnh song song với các trục Biết tọa độ 3 đỉnh Hãy tìm tọa độ của điểm còn lại của hình chữ nhật
rewrite(output);
write(rx,#32,ry);
Trang 14begin doctep;
xuli;
ghikq;
end
3 Giao điểm của đường chéo trong đa giác - NUMPOLY
Cho trước một đa giác lồi N cạnh, thỏa mãn không có 3 đường chéo nào đồng quy Hãy đếm số giao điểm tạo bởi các cặp đường chéo trong đa giác
Hình vẽ minh họa với lục giác:
Trang 154 Khoảng cách - PTIT013C
Với hai điểm P(xP,yP) và Q(xQ,yQ) trên mặt phẳng, khoảng cách giữa chúng được tính theo công thức:
d(P,Q) = √(xP-xQ)2+(yP-yQ)2
Nhiệm vụ của bạn là viết chương trình nhập vào 4 số nguyên là tọa độ 2 điểm A,B:
xA, yA, xB, yB và tìm điểm M trên trục Ox để giá trị d(M,A) + d(M,B) đạt giá trị nhỏ nhất
Input
Dữ liệu vào gồm nhiều bộ dữ liệu tương ứng với nhiều test Dòng đầu tiên chứa một
số nguyên dương không lớn hơn 20 là số lượng các bộ dữ liệu Các dòng tiếp theo chứa các bộ dữ liệu
Mỗi bộ test gồm 4 số nguyên xA, yA, xB, yB (có giá trị tuyệt đối < 106)
Ox, kẻ B’A, giao điểm của B’A và Ox chính là tọa độ tối ưu của M như vậy ta chỉ cần tính chiều dài của B’A bằng pytago là được
Trang 16end;
close(f);
end
5 XOAYDT - Xoay đường tròn (Codeforce 287B)
Cho một đường tròn có bán kính r, tâm đường tròn đang ở tại tọa độ (x, y) Người ta cần di chuyển tâm đường tròn đến tọa độ (xd, yd) bằng nhiều bước xoay đường tròn Tại mỗi bước lấy một cây kim chấm vào một vị trí nào đó trên đường tròn và xoay tâm đường tròn quanh cây kim này Hỏi số lần xoay ít nhất là bao nhiêu?
Trang 17Dữ liệu nhập: Gồm 4 dòng
- Dòng thứ i gồm hai số nguyên xi và yi là hoành độ và tung độ của điểm thứ i, hai số cách nhau một khoảng trắng (-100 ≤ xi, yi ≤ 100) Dữ liệu cho đảm bảo không có hai điểm nào trùng nhau
pair <int,int> a[5];
vector <int> dist;
main()
{
for (int i=1; i<=4; i++) scanf("%d %d", &a[i].first, &a[i].second);
for (int i=1; i<=3; i++)
for (int j=i+1; j<=4; j++)
dist.push_back((a[i].first-a[j].first)*(a[i].first-a[j].first) + (a[i].second-a[j].second)*(a[i].second-a[j].second)); sort(dist.begin(), dist.end());
printf("%s", (dist[0]==dist[3] && dist[4]==dist[5]) ? "YES" : "NO");
}
7 GHVU - Ghép hình vuông
Trang 18Ba bé Bo mua cho bé Bo 03 miếng ghép đồ chơi hình chữ nhật và hỏi bé Bo có ghép 03 hình chữ nhật trên thành một hình vuông lớn được hay không Bé Bo đang loay hoay tìm cách ghép Bạn hãy giúp bé Bo tìm cách ghép để ba tiếp tục mua đồ chơi cho bé nhé
Dữ liệu nhập: gồm 3 dòng
- Tại dòng thứ i gồm hai số nguyên ai, bi là chiều dài và chiều rộng của hình chữ nhật thứ i (1 ≤ ai, bi ≤ 10) Hai số cách nhau một khoảng trắng
Dữ liệu xuất:
- Nếu có cách ghép thành hình vuông được, in ra "YES", nếu không, in ra "NO" Chú
ý các hình chữ nhật phải ghép vừa khớp, hình này không đè lên hình kia
Trang 19if ((rect[1].x == rect[2].x && rect[2].x == rect[3].x && rect[1].x == rect[1].y+rect[2].y+rect[3].y)
|| (rect[1].x == rect[2].x && rect[1].x+rect[3].x == rect[3].x && rect[1].y+rect[2].y == rect[3].x)
|| (rect[1].x == rect[2].y && rect[1].x+rect[3].y == rect[3].x && rect[1].y+rect[2].x == rect[3].x)
|| (rect[1].y == rect[2].x && rect[1].y+rect[3].x == rect[3].x && rect[1].x+rect[2].y == rect[3].x)
|| (rect[1].y == rect[2].y && rect[1].y+rect[3].y == rect[3].x && rect[1].x+rect[2].x == rect[3].x))
printf("YES");
else printf("NO");
}
Và một số bài tập hình học cơ bản khác trên spoj
B2 Bài tập mức nâng cao
1 Giao điểm cao nhất
Trong lễ hội bắn pháo hoa năm nay Tiết mục trình diễn ánh sáng trong lễ khai mạc của chủ nhà Đà Nẵng, có N tia laser được chiếu lên trời nhờ vào các đèn chiếu có công suất rất lớn, vì vậy các tia laser này có thể đi rất xa Các tia laser được chiếu lên nằm trên cùng một mặt phẳng thẳng
đứng nên nếu không có 2 tia laser nào
song song với nhau thì 2 tia laser hoặc
là cắt nhau hoặc là không cắt nhau
Các tia laser được biểu diễn bởi
3 số nguyên: Một số là tọa độ X ở
dưới đất của ngọn đèn chiếu, 2 số còn
lại là tọa độ của một điểm nào đó
thuộc tia laser này Biết rằng không có
2 tia laser nào song song với nhau và
cũng không có tia Laser nào trùng với
mặt đất (mặt đất được coi như là đường thẳng y = 0) Không có đèn chiếu nào đặt cùng một vị trí trên tục tọa độ
Yêu cầu: Các nhà tổ chức buổi trình diễn muốn bạn cho biết với các tia laser sẽ được
chiếu lên trời như trong kế hoạch thì 2 tia laser nào cắt nhau tại điểm cao nhất
Dữ liệu vào: Từ tệp văn bản ‘H_MAX.INP’ gồm:
• Dòng 1 ghi số nguyên N là số tia laser (2 ≤ n ≤ 100000)
điểm ( xi , 0 ) và ( zi , ti ) (|xi|, |zi| < 106, 0< ti ≤ 106)
Kết quả: Ghi ra tệp văn bàn ‘H_MAX.OUT’ như sau:
• Trong trường hợp không có 2 tia laser nào cắt nhau thì ghi ra duy nhất một số
Trang 20Ví dụ:
2 -1 -2 4
2 3 5
-1
4 -1 -2 4
- Subtask 1: Duyệt chọn ra 2 tia, tìm điểm giao và tính chiều cao Trong các chiều cao
này thí sinh có không quá 40% số điểm của bài thi
tạo bởi một tia laser với trục nằm ngang (chiều dương là chiều ngược chiều kim đồng
hồ) là góc của tia đó
function goc(x, y : extended) : extended;
begin
if x = 0 then goc := pi / 2
else if x * y > 0 then goc := arctan(y / x)
else if x * y < 0 then goc := pi + arctan(y / x);
end;
Hàm tính góc theo đúng công thức thuần toán học bằng
việc sự dụng hàm số arctan (mặc dù sử dụng hàm arctan
theta := t;
end;
Nhận xét: Nếu tia i và tia j giao nhau (với điều kiện góc của tia j là góc có giá trị gần với góc của tia i nhất) thì độ cao giao điểm của hai tia đó sẽ lớn hơn độ cao giao điểm của tia i với các tia khác tia j Từ đó ta có thuật toán:
- Sắp xếp các tia theo thứ tự tăng dần (hoặc giảm dần) của góc tạo bởi các tia
- Duyệt 1 lần theo thứ tự và xét chiều cao giao điểm của hai tia cạnh nhau theo thứ tự mảng đó
- Lưu lại giá trị lớn nhất tìm được
Độ phức tạp thuật toán chủ yếu nằm ở bước sắp xếp các tia ~ O(NLogN)