PHƯƠNG PHÁP GIẢI TOÁN HÌNH HỌC BẰNG NGÔN NGỮ LẬP TRÌNH PASCAL
Tin học và nhà trường
Qua quá trình tham gia giảng dạy và bồi dưỡng học sinh giỏi chúng tôi thấy nhiều bài toán
đòi hỏi học sinh phải tìm ra mô hình toán học cụ thể từ yêu cầu phức tạp của bài toán.
Thực tế cho thấy những học sinh có khả năng vận dụng kiến thức toán học vào quá trình
phân tích đề bài sẽ nhanh chóng phát hiện được mô hình toán học của bài toán và đưa ra lời
giải hợp lý. Việc hướng cho học sinh phát hiện ra những mối liên hệ của bài toán cần giải
quyết với các kiến thức toán thông dụng qua quá trình tìm hiểu nội dung bài toán là không
dễ dàng gì. Với mong muốn phần nào giúp học sinh cũng như giáo viên trong việc tìm ra lời
giải cho một số dạng bài toán thường gặp trong chương trình THPT cần giải quyết lập trình
đó là
các bài toán hình học
, chúng tôi xin giới thiệu
phương pháp giải toán hình học
bằng ngôn ngữ lập trình Pascal
mà chúng tôi đã áp dụng trong quá 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ố các thuật toán đều tập trung vào văn bản và các con số, chúng được thiết kế và xử lý
sẵn trong phần lớn các môi trường lập trình. Đối với các bài toán hình học thì tình huống
khác hẳn, ngay cả các phép toán sơ cấp trên điểm và đoạn thẳng cũng có thể là một thách
thức về tính toán.
Các bài toán hình học thì dễ hình dung một cách trực quan nhưng chính điều đó lại có thể là
một trở ngại. Nhiều bài toán có thể giải quyết ngay lập tức bằng cách nhìn vào một mảnh
giấy nhưng lại đòi hỏi những chương trình không đơn giản.
Ví dụ
: Bài toán kiểm tra một điểm có nằm trong đa giác hay không?
2. Đối tượng hình học cơ bản.
Trong các bài toán tin học thuộc loại hình học có 3 đối tượng cơ bản là: Điểm, đoạn thẳng và
đa giác.
- Điểm: Được xác định là cặp (x,y) trong hệ toạ độ đề các.
- Đoạn thẳng: Là cặp điểm được nối với nhau bằng một phần của đường thẳng.
- Đa giác: Là dãy các điểm mà 2 điểm liên tiếp nối với nhau bởi đoạn thẳng và điểm đầu nối
với điểm cuối tạo thành đường gấp khúc khép kín.
3. Dữ liệu lưu trữ các đối tượng hình học cơ bản
II. MỘT SỐ PHÉP TOÁN CƠ BẢN
1. Vị trí tương đối của điểm so với đường thẳng, tia và đ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 đi qua 2 đ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 khi
- Điểm M thuộc đoạn thẳng AB khi:
- Chương trình:
2. Giao của các đoạn thẳng, đường thẳng và tia
Bài toán 2.
Cho 2 đường thẳng có phương trình . Tìm giao
điểm (nếu có) của 2 đường thẳng trên.
Phương pháp:
+ Nếu D=Dx=Dy=0 thì kết luận 2 đường thẳng trùng nhau
+ Nếu D=0 và ((Dx ≠0) hoặc (Dy ≠ 0)) thì kết luận 2 đường thẳng song song
+ Nếu D ≠ 0 thì kết luận 2 đường thẳng cắt nhau tại điểm có (Dx/D, Dy/D)
Chương trình:
Bài toán 3. Cho 2 đoạn thẳng AB và CD với . Tìm giao
điểm (nếu có) của 2 đoạn thẳng
Phương pháp:
Bước 1. Tìm giao điểm M của 2 đường thẳng AB và CD
Bước 2. Kiểm tra M có thuộc đồng thời cả 2 đoạn AB và CD hay không. Nếu có đó là giao
điểm cần tìm, ngược lại kết luận không có.
Chương trình:
Bài toán 4. Cho tia AM chứa điểm B (khác A) và đoạn thẳng CD
với . Tìm giao điểm (nếu có) của tia AM với đoạn thẳng
CD.
- Phương pháp:
Bước 1. Tìm giao điểm N của 2 đường thẳng AB và CD
Bước 2. Kiểm tra N có thuộc tia AM và đoạn thẳng CD hay không. Nếu có đó là 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í của điểm so với đa giác
Bài toán 5. Cho đa giác gồm N đỉnh và điểm M. Xác định vị trí tương đối của M
với miền trong đa giác.
Phương pháp:
Bước 1. Kiểm tra M có thuộc cạnh nào của đa giác hay không, nếu có thì kết luận M thuộc
miền trong đa giác và kết thúc
Bước 2. Kẻ MN song song với trục hoành (điểm N có hoành độ lớn hơn max hoành độ của đa
giác)
Bước 3. Xác định d là số giao điểm của MN với các cạnh của đa giác. Những trường hợp sau
được coi như là tăng thêm 1 giao điểm:
+ Đỉnh d[i] không thuộc đoạn thẳng MN, đỉnh d[i+1] nằm trên đoạn thẳng MN, 2 đỉnh d[i]
và d[i+2] khác phía so với đường thẳng MN.
+ Đỉnh d[i-1], d[i+2] ngoài đoạn thẳng MN, hai đỉnh d[i] và d[i+1] thuộc đoạn MN, d[i-1] và
d[i+1] khác phía so với đường thẳng MN
+ Đỉnh d[i] và d[i+1] không thuộc MN và cạnh (d[i],d[i+1]) cắt đoạn thẳng MN
PHẦN II. MỘT SỐ DẠNG BÀI TOÁN HÌNH HỌC THƯỜNG GẶP
Dạng 1. Mối quan hệ giữa điểm, đoạn thẳng, đa giác.
Phương pháp: Đây là một trong số dạng bài toán hình học đơn giản nhất. Việc giải bài
toán dạng này chủ yếu sử dụng các kiến thức hình học cơ bản (đã trình bày đầy đủ
trong phần trên)
VD
1
Ba điểm thẳng hàng
Cho N điểm, hãy kiểm tra xem có bao nhiêu bộ 3 điểm thẳng hàng.
Input:
Cho trong tệp văn bản DL.INP
- Dòng thứ 1 ghi số N
- N dòng tiếp theo, mỗi dòng ghi toạ độ của một điểm.
Output:
Ghi vào tệp KQ.OUT chứa một số duy nhất là số bộ 3 điểm thẳng hàng.
(Giới hạn: 1<=N<=2000, toạ độ các điểm có giá trị tuyệt đối không quá 10000)
Chương trình:
VD
2
.
Đường thẳng cắt nhau
Cho n đường thẳng A
i
B
i
(1 ≤i ≤n) phân biệt với A
i
, B
i
là các điểm cho trước. Hãy thông
báo ra màn hình các cặp đường thẳng đôi một cắt nhau.
Dữ liệu: Cho trong file DL.INP gồm N dòng (N không biết trước). Dòng thứ i ghi 4 số
thực x
Ai
y
Ai
x
Bi
y
Bi
. Các số trên cùng một dòng ghi cách nhau ít nhất một dấu cách.
Ý tưởng:
- Mỗi đường thẳng được đặc trưng bởi 3 thông số a,b,c được xác định:
a:=(y1-y2); b:=(x2-x1) ; c:=x1*y2-x2*y1;
- Hai đường thẳng cắt nhau khi: D:=a1*b2-a2*b1 ? 0;
Chương trình:
VD
3
.
Điểm thuộc đa giác.
Cho đa giác không tự cắt A
1
A
2
...A
N
với các đỉnh A
i
(x
i
,y
i
) nguyên. Với điểm A(x
A
,y
A
) cho
trước, hãy xác định xem A có nằm trong đa giác đã cho hay không (Trong trường hợp
trên cạnh đa giác xem như nằm trong đa giác)
Dữ liệu:
Cho trong tệp Dagiac.inp
+ Dòng đầu là số N
+ N dòng tiếp theo mỗi dòng ghi x
i
,y
i
là toạ độ A
i
+ Dòng n+2 ghi 2 số x
A
và y
A
Dữ liệu là các số nguyên.
Kết quả:
Đưa ra màn hình thông báo điểm A có nằm trong đa giác hay không
Ý tưởng:
- Lưu toạ độ các đỉ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 trên cạnh đa giác
- Tìm giao điểm nếu có của tia Ax (Ax//Ox và Ax hướng theo phần dương trục hoành)
với các cạnh của đa giác. Trường hợp tia Ax chứa đoạn thẳng cạnh đa giác ta xem như
tia Ax có 1 điểm chung với cạnh này. Cụ thể:
+ Giả sử điểm A(x
0
,y
0
), chọn điểm B(x
b
,y
b
) với x
b
=x
0
+1,y
b
=y
0
+ Kiểm tra tia AB có cắt đoạn thẳng CD bằng cách:
B
1
. Tìm giao điểm N của 2 đường thẳng AB và 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 thì toạ độ giao điểm là N(Dx/D,Dy/D) B
2
. Kiểm tra N có thuộc tia
AM và đoạn thẳng CD hay không.
- Điểm N thuộc đoạn thẳng CD khi: Min(x
C
,x
D
) ≤x
N
≤ Max(x
C
,x
D
) và
Min(y
C
,y
D
) ≤ yN ≤ Max(y
C
,y
D
)
- Điểm N thuộc tia AB khi có nghĩa là N phải thoả mãn điều kiện: (x
N
-x
A
)(x
B
-
x
A
) ≥0 và (y
N
-y
A
)(y
B
-y
A
) ≥0
+ Kiểm tra tia AB chưa cạnh CD hay không bằng cách: (yc=yd)and(yc=yo)
- Đếm số giao điểm, nếu số giao điểm lẻ thì A thuộc đa giác
Chương trình:
VD
4
.
Đế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 và yi(i=1,...,n) là các số
nguyên trong đoạn [-10
6
,10
6
]. Các đỉnh được liệt kê theo thứ tự cùng chiều kim đồng
hồ.
Viết chương trình tìm số điểm có toạ độ nguyên nằm trong hay trên biên đa giác.
Dữ liệu: Cho trong tệp tin DL.INP.
- Dòng đầu chứa số nguyên duy nhất cho biết số đỉnh.
- Tiếp theo là các dòng, trên mỗi dòng có 2 số nguyên cách nhau một khoảng trắng lần
lượt là hoành độ, tung độ các đỉnh đa giác.
Kết quả: Xuất ra màn hình số điểm có toạ độ nguyên nằm trong hay trên biên đa giác
Ý tưởng:
- Tính a,b theo công thức:
- Xác định số điểm có toạ độ nguyên: Sđ=round(abs(a/2)+b/2+1)
Chương trình: