Trên mặt phẳng tọa độ, một hình chữ nhật với các cạnh song song với các trục toạ độ được xác định bởi hai điểm đối tâm: đỉnh góc trên bên trái và đỉnh góc dưới bên phải.. Cho N hình.[r]
(1)PHƯƠNG PHÁP GIẢI TỐN HÌNH HỌC BẰNG NGƠN NGỮ LẬP TRÌNH PASCAL Tin học nhà trường Qua trình tham gia giảng dạy bồi dưỡng học sinh giỏi chúng tơi thấy nhiều tốn địi hỏi học sinh phải tìm mơ hình tốn học cụ thể từ yêu cầu phức tạp toán Thực tế cho thấy học sinh có khả vận dụng kiến thức tốn học vào q trình phân tích đề nhanh chóng phát mơ hình tốn học tốn đưa lời giải hợp lý Việc hướng cho học sinh phát mối liên hệ toán cần giải với kiến thức tốn thơng dụng qua q trình tìm hiểu nội dung tốn khơng dễ dàng Với mong muốn phần giúp học sinh giáo viên việc tìm lời giải cho số dạng toán thường gặp chương trình THPT cần giải lập trình các tốn hình học, chúng tơi xin giới thiệu phương pháp giải tốn hình học
bằng ngơn ngữ lập trình Pascal mà chúng tơi áp dụng q trình giảng dạy
I KHÁI NIỆM HÌNH HỌC VÀ CÁC ĐỐI TƯỢNG HÌNH HỌC CƠ BẢN 1 Khái niệm hình học.
Đa số thuật tốn tập trung vào văn số, chúng thiết kế xử lý sẵn phần lớn mơi trường lập trình Đối với tốn hình học tình khác hẳn, phép tốn sơ cấp điểm đoạn thẳng thách thức tính tốn
Các tốn hình học dễ hình dung cách trực quan điều lại trở ngại Nhiều tốn giải cách nhìn vào mảnh giấy lại địi hỏi chương trình khơng đơn giản
Ví dụ: Bài tốn kiểm tra điểm có nằm đa giác hay không?
2 Đối tượng hình học bản.
Trong tốn tin học thuộc loại hình học có đối tượng là: Điểm, đoạn thẳng đa giác
- Điểm: Được xác định cặp (x,y) hệ toạ độ đề
- Đoạn thẳng: Là cặp điểm nối với phần đường thẳng
- Đa giác: Là dãy điểm mà điểm liên tiếp nối với đoạn thẳng điểm đầu nối với điểm cuối tạo thành đường gấp khúc khép kín
(2)II MỘT SỐ PHÉP TỐN CƠ BẢN
1 Vị trí tương đối điểm so với đường thẳng, tia đoạn thẳng
Bài toán 1: Cho điểm Yêu cầu:
a) Kiểm tra M có thuộc đường thẳng qua điểm A, B hay không? b) Kiểm tra M có thuộc đoạn thẳng AB hay khơng
c) Kiểm tra M có thuộc tia AB hay khơng
Phương pháp:
Đặt
- Điểm M thuộc đường thẳng AB - Điểm M thuộc đoạn thẳng AB khi:
- Chương trình:
2 Giao đoạn thẳng, đường thẳng tia
Bài toán Cho đường thẳng có phương trình Tìm giao
điểm (nếu có) đường thẳng
Phương pháp:
+ Nếu D=Dx=Dy=0 kết luận đường thẳng trùng
+ Nếu D=0 ((Dx ≠0) (Dy ≠ 0)) kết luận đường thẳng song song + Nếu D ≠ kết luận đường thẳng cắt điểm có (Dx/D, Dy/D)
Chương trình:
(3)điểm (nếu có) đoạn thẳng
Phương pháp:
Bước Tìm giao điểm M đường thẳng AB CD
Bước Kiểm tra M có thuộc đồng thời đoạn AB CD hay không Nếu có giao điểm cần tìm, ngược lại kết luận khơng có
Chương trình:
Bài tốn 4. Cho tia AM chứa điểm B (khác A) đoạn thẳng CD
với Tìm giao điểm (nếu có) tia AM với đoạn thẳng CD
- Phương pháp:
Bước Tìm giao điểm N đường thẳng AB CD
Bước Kiểm tra N có thuộc tia AM đoạn thẳng CD hay khơng Nếu có giao điểm cần tìm, ngược lại kết luận khơng có
Chương trình:
3 Vị trí điểm so với đa giác
Bài toán 5. Cho đa giác gồm N đỉnh điểm M Xác định vị trí tương đối
M với miền đa giác Phương pháp:
Bước Kiểm tra M có thuộc cạnh đa giác hay khơng, có kết luận M thuộc miền đa giác kết thúc
Bước Kẻ MN song song với trục hồnh (điểm N có hồnh độ lớn max hoành độ đa giác)
Bước Xác định d số giao điểm MN với cạnh đa giác Những trường hợp sau coi tăng thêm giao điểm:
+ Đỉnh d[i] không thuộc đoạn thẳng MN, đỉnh d[i+1] nằm đoạn thẳng MN, đỉnh d[i] d[i+2] khác phía so với đường thẳng MN
+ Đỉnh d[i-1], d[i+2] đoạn thẳng MN, hai đỉnh d[i] d[i+1] thuộc đoạn MN, d[i-1] d[i+1] khác phía so với đường thẳng MN
(4)PHẦN II MỘT SỐ DẠNG BÀI TỐN HÌNH HỌC THƯỜNG GẶP Dạng Mối quan hệ điểm, đoạn thẳng, đa giác.
Phương pháp: Đây số dạng tốn hình học đơn giản Việc giải
bài toán dạng chủ yếu sử dụng kiến thức hình học (đã trình bày đầy đủ phần trên)
VD1 Ba điểm thẳng hàng
Cho N điểm, kiểm tra xem có điểm thẳng hàng
Input: Cho tệp văn DL.INP
- Dòng thứ ghi số N
- N dòng tiếp theo, dòng ghi toạ độ điểm
Output: Ghi vào tệp KQ.OUT chứa số số điểm thẳng hàng
(5)VD2 Đường thẳng cắt nhau
Cho n đường thẳng AiBi (1 ≤i ≤n) phân biệt với Ai, Bi điểm cho trước Hãy thơng báo hình cặp đường thẳng đôi cắt
Dữ liệu: Cho file DL.INP gồm N dịng (N khơng biết trước) Dịng thứ i ghi số thực xAi yAi xBi yBi Các số dịng ghi cách dấu cách
(6)- Mỗi đường thẳng đặc trưng thông số a,b,c xác định: a:=(y1-y2); b:=(x2-x1) ; c:=x1*y2-x2*y1;
- Hai đường thẳng cắt khi: D:=a1*b2-a2*b1 ? 0; Chương trình:
VD3 Điểm thuộc đa giác.
(7)Dữ liệu: Cho tệp Dagiac.inp + Dòng đầu số N
+ N dòng dòng ghi xi,yi toạ độ Ai + Dòng n+2 ghi số xA yA
Dữ liệu số ngun
Kết quả: Đưa hình thơng báo điểm A có nằm đa giác hay khơng
Ý tưởng:
- Lưu toạ độ đỉnh đa giác vào mảng A - Kiểm tra xem điểm A có trùng với đỉnh đa giác - Kiểm tra xem điểm A có nằm cạnh đa giác
- Tìm giao điểm có tia Ax (Ax//Ox Ax hướng theo phần dương trục hoành) với cạnh đa giác Trường hợp tia Ax chứa đoạn thẳng cạnh đa giác ta xem tia Ax có điểm chung với cạnh Cụ thể:
+ Giả sử điểm A(x0,y0), chọn điểm B(xb,yb) với xb=x0+1,yb=y0 + Kiểm tra tia AB có cắt đoạn thẳng CD cách:
B1 Tìm giao điểm N đường thẳng AB CD
Tính
a1:=yb-ya; b1:=xa-xb; c1:=ya*xb-xa*yb; a2:=yd-yc; b2:=xc-xd; c2:=yc*xd-xc*yd;
D:=a1*b2-a2*b1; Dx:=c2*b1-c1*b2; Dy:=a2*c1-a1*c2;
Xác định: Nếu D ≠0 toạ độ giao điểm N(Dx/D,Dy/D) B2 Kiểm tra N có thuộc tia AM đoạn thẳng CD hay không
(8)- Điểm N thuộc tia AB có nghĩa N phải thoả mãn điều kiện: (xN-xA)(xB-xA) ≥0 (yN-yA)(yB-yA) ≥0
+ Kiểm tra tia AB chưa cạnh CD hay không cách: (yc=yd)and(yc=yo) - Đếm số giao điểm, số giao điểm lẻ A thuộc đa giác
(9)(10)VD4 Đếm số điểm có toạ độ nguyên thuộc đa giác
Cho đa giác gồm n đỉnh (x1,y1), (x2,y2), , (xn,yn), biết xi yi(i=1, ,n) số nguyên đoạn [-106,106] Các đỉnh liệt kê theo thứ tự chiều kim đồng hồ
Viết chương trình tìm số điểm có toạ độ nguyên nằm hay biên đa giác
Dữ liệu:Cho tệp tin DL.INP
- Dòng đầu chứa số nguyên cho biết số đỉnh
- Tiếp theo dòng, dòng có số nguyên cách khoảng trắng hoành độ, tung độ đỉnh đa giác
Kết quả:Xuất hình số điểm có toạ độ nguyên nằm hay biên đa giác Ý tưởng:
- Tính a,b theo cơng thức:
(11)Dạng 2.Tính diện tích đa giác
Phương pháp:Giả sử cho đa giác có n đỉnh toạ độ đỉnh lưu vào mảng a Để tính diện tích đa giác ta làm sau:
Bước Gắn thêm đỉnh phụ:
a[n+1].x:=a[1].x; a[n+1].y:=a[1].y;
Bước Diện tích đa giác tính theo cơng thức:
Lưu ý:Có thể áp dụng cơng thức khác để tính diện tích trường hợp đặc biệt - Nếu đa giác tam giác (n=3) diện tích tính theo công thức:
(12)- Nếu đa giác hình trịn có bán kính R diện tích VD1.Xác định diện tích đa giác
Cho N đa giác lồi A1A2A3 AN-1AN với đỉnh Ai(xi,yi) có toạ độ nguyên Hãy tính diện tích đa giác
Dữ liệu:Cho file DL.INP gồm dòng - Dòng 1: Chứa số nguyên dương N
- Dòng 2: Chứa 2xN số nguyên dương x1y1x2y2 xNyNlà toạ độ đỉnh đa giác Mỗi số ghi cách dấu cách
Kết quả:Xuất hình diện tích đa giác Ý tưởng:
(13)(14)VD2.Dãy hình chữ nhật
Trong mặt phẳng toạ độ trực chuẩn, cho N hình chữ nhật có cạnh song song với trục toạ độ Mỗi HCN xác định toạ độ đỉnh bên trái đỉnh bên phải Hãy đưa dãy hình chữ nhật theo thứ tự tăng dần diện tích
Dữ liệu:Cho file HCN.inp gồm N+1 dòng - Dòng Chứa số N
-Dòng i+1 (1≤i≤N): Ghi số nguyên x1, y1, x2,y2lần lượt toạ độ đỉnh bên trái đỉnh bên phải HCN i (Các số ghi dịng cách dấu cách)
Kết quả:Ghi vào tệp HCN.out dãy hình chữ nhật sau xếp Ý tưởng:
(15)- Tính diện tích hình chữ nhật theo cơng thức:
- Sắp xếp mảng a tăng dần theo diện tích Ý tưởng:
Dạng Xác định diện tích phủ hình chữ nhật
Phương pháp: Giả sử có n hình chữ nhật Để tính diện tích phủ n hình chữ nhật
ta làm sau:
Bước Sử dụng a,b mảng lưu hồnh độ tung độ đỉnh hình chữ nhật (mỗi hình chữ nhật cần lưu toạ độ đỉnh đối diện qua tâm hình chữ nhật) Bước Sắp xếp mảng a,b theo thứ tự tăng dần
(16)trong hình chữ nhật ban đầu cộng thêm vào phần diện tích cần tìm diện tích hình chữ nhật
Ví dụ Diện tích phủ hình chữ nhật
Trong mặt phẳng toạ độ trực chuẩn, cho N hình chữ nhật có cạnh song song với trục toạ độ Mỗi HCN xác định toạ độ đỉnh bên trái đỉnh bên phải Hãy tính diện tích phần mặt phẳng bị phủ HCN
Dữ liệu: Cho file HCN.inp gồm N+1 dòng
- Dòng 1: Chứa số N
-Dòng i+1 (1 ≤i ≤N): Ghi số nguyên x1,y1,x2,y2 toạ độ đỉnh bên trái đỉnh bên phải HCN i Các số ghi dịng cách dấu cách
Kết quả: Đưa hình diện tích phần mặt phẳng bị phủ hình chữ nhật
Ý tưởng:
- Lập mảng X[1 2n], Y[1 2n] chứa hoành độ, tung độ hình chữ nhật - Lưu toạ độ ban đâu hình chữ nhật vào mảng a
- Sắp xếp mảng X,Y tăng dần
- Lần lượt kiểm tra hình chữ nhật có toạ độ đỉnh bên phải (xi+1,yi+1) toạ độ đỉnh bên phải (xi,yi) với ≤i ≤n-1 Nếu hình chữ nhật thuộc hình chữ nhật ban đầu cộng thêm vào phần diện tích cần tìm diện tích hình chữ nhật
Chương trình: Ví dụ Phủ S
Trên mặt phẳng tọa độ, hình chữ nhật với cạnh song song với trục toạ độ xác định hai điểm đối tâm: đỉnh góc bên trái đỉnh góc bên phải Cho N hình
chữ nhật song song với trục toạ độ Phủ S hình chữ nhật có diện tích nhỏ chứa N hình chữ nhật cho
Dữ liệu vào: Đọc từ tệp PHUCN.INP có cấu trúc:
- Dòng chứa N (N ≤30);
- Trong N dòng tiếp theo, dòng ghi số toạ độ hai đỉnh đối tâm hình chữ nhật, số số nguyên có trị tuyệt đối khơng q 100
(17)- Dòng ghi toạ độ hai đỉnh đối tâm phủ S hình chữ nhật
- Dịng ghi diện tích phần hình S khơng nằm hình chữ nhật N hình cho
- Ý tưởng:
- Xác định hình chữ nhật H nhỏ bao tất hình chữ nhật ban đầu:
Gọi minx,maxx hoành độ nhỏ lớn hoành độ đỉnh hình chữ nhật cho; miny,
maxy tung độ nhỏ lớn tung độ đỉnh hình chữ nhật cho Khi hình H có toạ độ đỉnh trái (minx,miny) đỉnh phải (max,maxy) Đó phủ S cần tìm
- Tính diện tích hình H (maxx-minx)(maxy-miny)
- Tính diện tích s phủ hình chữ nhật (đã nêu rõ phương pháp chung) - Phần diện tích cần tìm là: s1:=abs((maxx-minx)*(maxy-miny))-s
(18)(19)Ví dụ Diện tích phủ hình trịn
Trên mặt phẳng cho N hình trịn Tính diện tích phần mặt phẳng bị phủ hình trịn
Dữ liệu: Cho file INP.BL3 dòng đầu số lượng hình trịn, từ dịng thứ trở
mỗi dòng chứa số nguyên dương tọa độ x, y tâm bán kính hình trịn (các số dịng ghi cách dấu cách)
Kết quả: Xuất hình
- Ý tưởng:
- Tìm hình chữ nhật nhỏ có cạnh song song với trục toạ độ chứa toàn N hình trịn
- Chia hình chữ nhật thành lưới vng có cạnh 0.1 đơn vị, với thuộc hình chữ nhật kiểm tra xem có thuộc vào hình trịn hay khơng, có tăng diện tích cần tính lên 0.01 đơn vị
- Chương trình
Dạng Xác định đa giác nhỏ bao tất các điểm, đa giác cho
Phương pháp: Cho N điểm A1, A2, , AN mặt phẳng Để xác định đa giác
không tự cắt chứa số điểm cho bao tất điểm lại ta làm sau: Bước Tìm điểm có tung độ nhỏ Điểm đỉnh đa giác
Bước Giả sử ta chọn điểm PM Tìm điểm Pi cho góc hợp PMPi trục hoành nhỏ đồng thời góc phải lớn góc hợp PMPM-1 trục hoành Điểm Pi đỉnh đa giác
Bước Lấy kết dãy đỉnh P tìm
Lưu ý: Với tốn tìm đa giác bao cần ghi nhớ đa giác a bao đa giác b điểm đa giác b nằm đa giác a
Ví dụ Đa giác khơng tự cắt
Cho N điểm A1, A2, , AN mặt phẳng Các điểm có toạ độ ngun khơng có điểm chúng thẳng hàng Hãy viết chương trình thực cơng việc sau đây: Xác định đa giác khơng tự cắt có đỉnh số điểm điểm cho chứa tất điểm cịn lại có chu vi nhỏ Hãy tính diện tích đa giác
Dữ liệu: cho tệp HCN.INP gồm n+1 dòng
(20)+ Dòng i+1 (1≤ i ≤ N): Ghi chữ số nguyên xi,yi toạ độ đỉnh Ai Các số dòng cách khoảng trắng
Kết quả: Xuất tệp HCN.Out
+ Dòng 1: Ghi số K, V, S với K số đỉnh đa giác tìm được, V chu vi, S diện tích
+ Dịng i+1(1≤ i ≤ K): Ghi toạ độ đỉnh đa giác
- Ý tưởng:
- Tìm điểm có tung độ nhỏ Điểm đỉnh đa giác
(21)(22)Ví dụ Đa giác bao nhau
Cho N đa giác thoả mãn tính chất
- Với đa giác ln có đa giác mà điểm nằm đa giác - Các cạnh chúng khơng có điểm chung
Bài tốn đặt là: Với đa giác i, có đa giác bao nó? (i nằm đa giác)
Dữ liệu vào: Ghi tập tin văn Dagiac.Inp
- Dòng ghi số tự nhiên N (3≤N≤10000)
- Trên N dòng tiếp theo: Dịng thứ i+1 ghi thơng tin đa giác có số hiệu thứ i Bao gồm số Si số đỉnh đa giác (Si≥3), Si cặp số nguyên hoành độ tung độ đỉnh đa giác
Các số dịng cách khoảng trắng
Dữ liệu ra: Ghi tập tin Dagiac.Out - Gồm N dòng
- Dòng thứ i: Ghi số lượng đa giác bao đa giác i
- Ý tưởng:
- Sử dụng mảng a,vt,kq (với a[i] lưu giá trị hoành độ nhỏ đỉnh đa giác thứ i, vt[i] đa giác thứ i, mảng kq lưu kết quả)
- Thực xếp đa giác theo thứ tự tăng dần giá trị hoành độ nhỏ đỉnh đa giác
- Do theo điều kiện toán với đa giác ln có đa giác mà điểm nằm đa giác nên KQ[vt[i]] =i-1
(23)Ví dụ Hình chữ nhật bao nhau
Cho N hình chữ nhật mặt phẳng mà cạnh song song với trục toạ độ Biết hình chữ nhật i bao hình chữ nhật j đỉnh hình chữ nhật j nằm hình chữ nhật i nằm cạnh hình chữ nhật i
Một dãy hình chữ nhật gọi hình chữ nhật bao chiều dài k (k≥1) dãy gồm hình chữ nhật H1, H2, , Hk cho hình chữ nhật i bao hình chữ nhật i+1 với i=1 (k-1) Hãy tìm số k lớn nói
Dữ liệu vào: Được cho tập tin HCN.INP
(24)- N dòng tiếp theo, dòng thứ i ghi số nguyên x1, y1, x2, y2 (-10000< x1,y1,x2,y2<10000) hoành độ, tung độ đỉnh trái trên, phải hình chữ nhật
Kết quả: Được ghi vào tệp văn HCN.OUT gồm dòng chứa số nguyên
nhất số k tìm số -1 không tồn số k thoả điều kiện đề
- Ý tưởng:
- Tính diện tích hình chữ nhật (HCN)
- Sắp xếp lại HCN theo thứ tự không giảm diện tích HCN - Lập hàm kiểm tra HCN i bao HCN j, thoả mãn điều kiện:
(x1[i]<=x1[j]) and (y1[i]>=y1[j]) and (x2[i]>=x2[j]) and (y2[i]<=y2[j])
- Xác định số lượng HCN bao HCN i lưu vào phần tử mảng kq[i] biết rằng: kq[i]:=kq[j]+1
(25)(26)Ví dụ Hình chữ nhật bao nhau
Hình chữ nhật A bao hình chữ nhật B điểm thuộc hình chữ nhật B nằm thuộc hình chữ nhật A
Trong mặt phẳng Oxy cho n hình chữ nhật có cạch song song với trục toạ độ Yêu cầu:
1 Tìm số hình chữ nhật bao nhiều (số lượng hình phải >1)
2 Trong số tập hình chữ nhật bao nhau, tìm tập hình chữ nhật bao có tổng diện diện tích hình chữ nhật tập lớn
3 Tìm hiệu diện tích hình chữ nhật nhỏ bao tất hình chữ nhật cho với diện tích phần mặt phẳng bị phủ hình chữ nhật cho
Dữ liệu vào: Cho tệp văn HCN.IN
- Dòng đầu: n (số lượng hình chữ nhật, 1≤N≤1000)
- n dịng tiếp theo: Mỗi dòng chứa số dạng a, b, c, d (a, b, c, d số nguyên) với (a, b) (c, d) toạ độ hai đỉnh đối tâm hình chữ nhật
Kết quả: Xuất tệp văn HCN.Out
- Dòng đầu: Cho biết tập hình chữ nhật bao nhiều theo dạng k l m n với ý nghĩa-Hình chữ nhật thứ k thuộc hình chữ nhật thứ l, hình chữ nhật thứ l thuộc hình chữ nhật thứ m, hình chữ nhật thứ m thuộc hình chữ nhật n khơng có ghi từ "khong"
- Dịng thứ 2: Cho biết tập hình chữ nhật bao có tổng diện tích hình chữ nhật tập hợp lớn theo qui cách dịng thứ Nếu khơng ghi số
- Dòng thứ 3: Chứa số biểu diễn hiệu diện tích hình chữ nhật nhỏ bao tất hình chữ nhật cho với diện tích phần mặt phẳng bị phủ hình chữ nhật cho
- Ý tưởng:
- Lưu tọa độ đỉnh hình chữ nhật vào mảng x1,y1,x2,y2
- Dùng mảng bao(n,n) để đánh dấu hình chữ nhật bao nhau: Với bao[i,j]=1 có nghĩa hình chữ nhật i bao hình chữ nhật j, bao[i,j]=0 ngược lại
- Dãy hình chữ nhật thứ i, k, j gọi bao (Bao[i,k]+bao[k,j]>bao[i,j]) (bao[i,k]>0) (bao[k,j]>0) Sử dụng mảng KQ để lưu hình chữ nhật k thoả mãn - Hình chữ nhật nhỏ bao tất hình chữ nhật cho hình chữ nhật có toạ độ góc phải (xmin,ymin) toạ độ góc trái (xmax,ymax)
(27)